2

このメソッドを呼び出すたびに、クラッシュします。

    public bool findSAMAccountByName(string environmentUserName)
    {
        try
        {
            const string Domain = "someserver";
            // set up domain context
            PrincipalContext ctx = new PrincipalContext(ContextType.Domain, Domain);

            // find a user
            UserPrincipal user = UserPrincipal.FindByIdentity(ctx, environmentUserName);

            if (user != null)
            {
                // do something here....     
                string samAccountName = user.SamAccountName;
                return true;
            }
            return false;
        }

        catch (Exception e)
        {
            e.ToString();
        }
        return false;
    }

内側の例外は言う

{"保護されたメモリの読み取りまたは書き込みを試みました。これは、他のメモリが破損していることを示していることがよくあります。"}

StackTraceは

 at System.DirectoryServices.Interop.UnsafeNativeMethods.IAds.GetEx(String bstrName, Object& value)
   at System.DirectoryServices.PropertyValueCollection.PopulateList()
   at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
   at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer()
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()
   at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
   at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()
   at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate)
   at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, String identityValue)
   at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, String identityValue)
   at ActiveRecord.MainWindow.findSAMAccountByName(String environmentUserName) in MainWindow.xaml.cs:line 60
   at ActiveRecord.MainWindow..ctor() in MainWindow.xaml.cs:line 39

このメソッドを呼び出すとクラッシュが発生します

                if (findSAMAccountByName(Environment.UserName))
                {
                    Console.WriteLine("Username found");
                }

コードを削除/コメントすると、コンパイルされて正常に実行されます。


更新:DJKRAZEのアドバイスに従った後

const string Domain = "someserver";

2つの引数を受け入れるようにPrincipalContextを変更した後、新しいStackTraceは

      at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
4

1 に答える 1

3

このようなCocoaDevが機能するはずです。

const string Domain = "SomeServer.Foo.Bar.com";
const string Username = "someUserSamAccountName";

PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, Domain);
UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(principalContext,  Username);

値に置き換えてください。ユーザーが見つかったかどうかに関係なく、これが返されます。私は毎日ADを使用しており、アカウントの資格情報でテストしたところ、メソッドを変更して文字列samAccount、stringDomanNameを渡すように変更してください。

従うことができるハードコードされた例

const string Domain = "SLO1.Foo.Bar.biz:389";
const string Container = @"DC=Foo,DC=Bar,DC=biz";
const string Username = @"cocoadev";//replace with actual samAccountName
PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, Domain, Container);
UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(principalContext,  username);
于 2013-01-16T17:39:47.607 に答える