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# 中失败的主要内容,如果未能解决你的问题,请参考以下文章