UserPrincipal.FindByIdentity在64位WinPE下的C#中失败
我正在编写一个64位C#Windows窗体应用程序,它将在Windows PE 10 64位下运行,以从Active Directory中提取显示名称。我必须使用64位,因为我运行此功能的电脑只会启动UEFI,因此我无法启动到32位恢复环境。每次代码到达某个位置时,我都会收到错误消息:未知错误[0x80005000]。如果我编译它并在32位WindowsPE10中运行,它运行得很好,除了编译32位代码外,对代码没有任何修改 我使用的是VS2019,代码使用的是.NET v4.7 以下是我正在使用的代码:UserPrincipal.FindByIdentity在64位WinPE下的C#中失败,c#,winpe,C#,Winpe,我正在编写一个64位C#Windows窗体应用程序,它将在Windows PE 10 64位下运行,以从Active Directory中提取显示名称。我必须使用64位,因为我运行此功能的电脑只会启动UEFI,因此我无法启动到32位恢复环境。每次代码到达某个位置时,我都会收到错误消息:未知错误[0x80005000]。如果我编译它并在32位WindowsPE10中运行,它运行得很好,除了编译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;
}
}
以下是我的变量的含义:
dotterd.domain.com=我的域名main.interactiveUser=从其他表单登录域的用户名
main.interactivePwd=所述用户名的密码
combo1.Text=组合框中包含我要搜索的用户名的文本
wantedUser=我想要显示姓名的人的用户名
givenName=我正在搜索的用户名的显示名称
我尝试过使用和不使用OU=用户,结果都是一样的。如果我在Windows中正常运行,它也可以正常工作。我发现了一些关于可能用所有者信息编辑注册表的帖子,这没有什么区别
你知道为什么会发生这种情况吗?过去在64位WinPE中访问注册表时遇到过类似的问题。根据我的理解,这正是PrincipalContext所做的。 在我的情况下,我必须取消选中 喜欢32位 在VS中的“生成”选项卡上
PS:本可以只发表评论,但目前我的声誉不够我这么做了,但问题依然存在。如果我让它是“任意cpu”,并保留“首选32位”复选框,那么程序在WinPE中根本不会启动。如果我直接编译x64,或者取消选中“Preference 32-bit”,就会出现我在原始帖子中提到的错误。我知道你必须为WinPE 64使用一套完全不同的软件包。您是否有可能在PE构建脚本中意外地留下了32位包的路径,或者可能遗漏了一个包?我尝试重新创建我的64位PE环境,只加载了64位.NET framework、脚本和WMI OCs。还是会出错。再次重建,并添加了除我知道我不需要的OCs和许多我知道我不需要的OCs之外的所有内容。所有操作仍然失败,并出现相同的错误。当我重新创建PE环境时,我只对OCs和原始内容使用amd64。