【问题标题】:Code crashing when trying to create PrincipalContext尝试创建 PrincipalContext 时代码崩溃
【发布时间】:2013-01-16 17:19:58
【问题描述】:

每当我调用此方法时,我都会崩溃。

    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");
                }

如果我删除/注释代码,它会编译并运行良好。


更新:听从 DJ KRAZE 的建议

const string Domain = "someserver";

更改 PrincipalContext 接受 2 个协议后,新的 StackTrace 为

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

【问题讨论】:

  • 在哪一行抛出异常?
  • 我调用这个方法 if (findSAMAccountByName(Environment.UserName)) { Console.WriteLine("Username found"); }
  • 在 findSAMAccountByName 函数中的哪一行?请在调试模式下运行...
  • 你可以替换 if 语句并尝试类似UserPrincipal foundUser = UserPrincipal.FindByIdentity(domain, IdentityType.Name, username);
  • 你的Domain and DC= 是什么样的......?

标签: c# wpf principal


【解决方案1】:

Cocoa Dev 这样的东西应该可以工作..

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 ,字符串域名;

您可以遵循的硬编码示例

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);

【讨论】:

  • 堆栈跟踪发生了变化,但 InnerException 是一样的。
  • Cocoa Dev,如果更新评论或删除它,该代码对您有用吗.. 所以它不会引起混淆也请放置您的 DC=看起来像这样我可以为您提供一个解决方案上周我帮助一个 OP 解决了同样的问题..谢谢
  • 我需要将完全限定的域作为服务器的一部分,还是只需要服务器名称?
  • 我将发布一个示例,该示例将为您提供一个想法,只需遵循该模式,但将其替换为您自己的值即可
  • 添加容器实际上停止了问题。
猜你喜欢
  • 1970-01-01
  • 2020-12-07
  • 2018-06-01
  • 2017-03-20
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多