gpt4 book ai didi

.net - "Unknown error (0x80005000)"尝试使用 DirectoryEntry 和模拟读取远程 IIS 6 配置数据库 (C#)

转载 作者:行者123 更新时间:2023-12-01 22:58:09 25 4
gpt4 key购买 nike

(编辑)情节变得更加复杂:相同的代码(无需模拟!)可以从 Windows 7 客户端成功运行,但不能从 Windows 2008 R2 客户端运行!这是有问题的代码。 (原始消息遵循以下代码。)

var entry = new DirectoryEntry("IIS://" + tbHost.Text + "/W3SVC", tbUsername.Text, tbPassword.Password);
foreach (DirectoryEntry site in entry.Children)
{
Console.Write("Site {0}\n", site.Name);
foreach (PropertyValueCollection prop in site.Properties)
Console.Write("{0}={1}\n", prop.PropertyName, prop.Value);
}

我读到here对于 IIS 提供程序,您在创建 DirectoryEntry 时无法传递凭据目的。你必须做impersonation 。因此,我尝试了以下代码,但当我尝试读取属性时,我仍然收到带有“未知错误(0x80005000)”文本的 COMException,就像我之前尝试传递 DirectoryEntry 的用户名和密码时所做的那样。构造函数。以下是概要:

  • LogonUser() 成功,凭据正常。在我发现我必须使用 LOGON32_LOGON_NEW_CREDENTIALS 之前,我的头被撞了一下。而不是LOGON32_LOGON_INTERACTIVE .
  • 远程计算机不在同一域中。实际上,它根本不在域中。事实上,我把它的名字放在了客户端的hosts中。文件,以便我可以通过名称找到它。
  • 正在运行 Metabase Explorer目标机器中显示我想要读取的 key 确实存在。 (见文章末尾的图片。)

.

const int LOGON32_LOGON_INTERACTIVE = 2;
const int LOGON32_LOGON_NETWORK = 3;
const int LOGON32_LOGON_NEW_CREDENTIALS = 9;

const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_PROVIDER_WINNT50 = 3;
const int LOGON32_PROVIDER_WINNT40 = 2;
const int LOGON32_PROVIDER_WINNT35 = 1;

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern int LogonUser(String lpszUserName, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);

[DllImport("kernel32.dll")]
extern static int GetLastError();

(...)

IntPtr myToken = IntPtr.Zero;
if (LogonUser(tbUsername.Text, tbHost.Text, tbPassword.Password, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, ref myToken) == 0)
{
int causingError = GetLastError();
throw new System.ComponentModel.Win32Exception(causingError);
}

WindowsImpersonationContext myMission = WindowsIdentity.Impersonate(myToken);

string mbUri = "IIS://" + tbHost.Text + "/MimeMap";
DirectoryEntry myDirEntry = new DirectoryEntry(mbUri);
Console.Write("{0}\n", myDirEntry.Properties["KeyType"]);

myDirEntry.Close();
myMission.Undo();
if (myToken != IntPtr.Zero)
CloseHandle(myToken);

enter image description here

最佳答案

明白了。我所要做的就是转到服务器管理 → 角色 → Web 服务器 (IIS) 并启用服务管理工具 → IIS 6 管理兼容性 → IIS 6 元数据库兼容性。见下图。

它位于客户端计算机中,因此您实际上不必安装 IIS 中的任何其他内容。

我想知道这对于非服务器 Windows(XP、Vista、7)如何工作。

enter image description here

关于.net - "Unknown error (0x80005000)"尝试使用 DirectoryEntry 和模拟读取远程 IIS 6 配置数据库 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5641536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com