«Неизвестная ошибка (0x80005000)» при попытке чтения удаленной метабазы ​​IIS 6 с DirectoryEntry и олицетворением (C #) - PullRequest
4 голосов
/ 13 апреля 2011

(РЕДАКТИРОВАТЬ) Сгущение графика: Тот же код (без необходимости подражания!) Успешно выполняется из клиента 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);
}

Я прочитал здесь , что для поставщика IIS нельзя передавать учетные данные при создании DirectoryEntry объект.Вы должны сделать олицетворение .Поэтому я попробовал следующий код, но я все еще получаю COMException с текстом «Неизвестная ошибка (0x80005000)», когда я пытаюсь прочитать свойство, так же как я делал, когда ранее пытался передать имя пользователя и пароль для DirectoryEntryконструктор.Вот краткое изложение:

  • LogonUser() успешно, учетные данные в порядке.Я немного ударился головой, прежде чем обнаружил, что мне нужно использовать LOGON32_LOGON_NEW_CREDENTIALS вместо LOGON32_LOGON_INTERACTIVE.
  • Удаленная машина не находится в том же домене.На самом деле, это не в домене вообще.На самом деле, я поместил его имя в файл hosts клиента, чтобы я мог получить его по имени.
  • Запуск Проводник метабазы ​​ на целевой машине показывает мне ключ, который я хочу прочитатьсуществует.(См. Рисунок в конце сообщения.)

.

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

Ответы [ 2 ]

3 голосов
/ 14 апреля 2011

Понял.Все, что мне нужно было сделать, это зайти в Управление сервером → Роли → Веб-сервер (IIS) и включить Сервис-инструменты управления → Совместимость управления IIS 6 → Совместимость метабазы ​​IIS 6.См. Рис. Ниже.

Он находится на клиентском компьютере, поэтому вам не нужно устанавливать что-либо еще из IIS.

Интересно, как это будет работать для несерверной Windows (XP, Vista, 7).

enter image description here

0 голосов
/ 22 октября 2013

Вы также можете открыть Powershell от имени администратора и использовать следующее для включения совместимости управления IIS 6:

Import-Module Servermanager
Add-WindowsFeature Web-Mgmt-Compat -IncludeAllSubFeature
Get-WindowsFeature #Show list of all installed features
...