UserPrincipal.FindByIdentity 在 64 位 WinPE 下的 C# 中失败

Posted

技术标签:

【中文标题】UserPrincipal.FindByIdentity 在 64 位 WinPE 下的 C# 中失败【英文标题】:UserPrincipal.FindByIdentity fails in C# under 64bit WinPE 【发布时间】:2019-11-21 18:34:11 【问题描述】:

我正在编写一个 64 位 C# Windows 窗体应用程序,它将在 64 位 Windows PE 10 下运行,以从 Active Directory 中提取显示名称。我必须使用 64 位,因为我运行它的 PC 只会启动 UEFI,因此我无法启动到 32 位恢复环境。每次我的代码到达某个位置时,我都会收到错误消息:未知错误 [0x80005000]。如果我编译它并在 32 位 Windows PE 10 中运行,它运行良好,除了编译 32 位之外无需修改代码。

我使用的是 VS2019,代码使用的是 .NET v4.7。

下面是我正在使用的代码:

    using (PrincipalContext ad = new PrincipalContext(ContextType.Domain, 
        "dotted.domain.com", "OU=Users,DC=dotted,DC=domain,dc=com", 
        ContextOptions.Negotiate, main.interactiveUser, main.interactivePwd))
    
        try
        
            //this is where it fails
            using (UserPrincipal wantedUser = UserPrincipal.FindByIdentity(ad, combo1.Text))
            
                if (wantedUser != null)
                
                    givenName = wantedUser.DisplayName;
                
                else
                
                    MessageBox.Show("User name not found in AD.  Please locate manually", 
                        "Error finding name", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    givenName = "DisplayNameNotFoundInAD";
                
            
        
        catch (Exception ex)
        
            MessageBox.Show(ex.Message);
            break;
        
    

这是我的变量的含义:

dotted.domain.com = 我的域名 main.interactiveUser = 从另一个表单登录域的用户名 main.interactivePwd = 所述用户名的密码 combo1.Text = 组合框中包含我要搜索的用户名的文本 WantedUser = 我想要显示名称的人的用户名 givenName = 我正在搜索的用户名的显示名称

我在有和没有 OU=Users 的情况下都试过了,结果相同。如果我在 Windows 中正常运行,它也可以正常工作。我发现了一些其他关于可能使用所有者信息编辑注册表的帖子,这没有任何区别。

关于为什么会发生这种情况的任何想法?

【问题讨论】:

【参考方案1】:

过去在 64 位 WinPE 中访问注册表时遇到过类似问题。据我了解,这正是 PrincipalContext 所做的。 就我而言,我不得不取消选中

更喜欢 32 位

在 VS 的构建选项卡上。

PS:本来只会评论,但目前我的声誉还不够

【讨论】:

我这样做了,但问题仍然存在。如果我将其设置为“任何 cpu”并选中“首选 32 位”,则该程序根本不会在 WinPE 中启动。如果我直接编译 x64,或者取消选中“首选 32 位”,则会出现我原来的帖子中提到的错误。 我知道您必须为 WinPE 64 使用一组完全不同的软件包。您是否有可能不小心留下了 32 位软件包的路径,或者可能在您的PE 构建脚本? 我尝试重新创建我的 64 位 PE 环境并仅加载了 64 位 .NET 框架、脚本和 WMI OC。仍然收到错误。再次重建它并添加除了我知道我不需要的 OC 和许多我知道我不需要的 OC 之外的所有内容。所有仍然失败并出现相同的错误。当我重新创建我的 PE 环境时,我只对 OC 和原始内容使用 amd64。

以上是关于UserPrincipal.FindByIdentity 在 64 位 WinPE 下的 C# 中失败的主要内容,如果未能解决你的问题,请参考以下文章