Исключение олицетворения, вызывающее метод DirectoryEntry.Invoke - PullRequest
0 голосов
/ 11 августа 2011

У меня неприятная проблема при попытке использовать метод System.DirectoryServices.DirectoryEntry.Invoke () для перезапуска пулов приложений на удаленном сервере IIS.

Основной контекст - это две клиентские машины и серверная машина IIS 7.0 (Windows 2008 Server), myServer, все в одном домене Windows. Я хочу запустить код на клиентских машинах, чтобы перезапустите AppPool на сервере IIS.

Вот соответствующий фрагмент кода:

DirectoryEntry directoryEntry = new DirectoryEntry («IIS: // myServer / W3SVC / AppPools / SomeAppPool», domainUserid, пароль, AuthenticationTypes.Secure);

directoryEntry.Invoke ("Recycle", null);

С одного клиентского компьютера код выполняется успешно, но на другом клиентском компьютере код выдает исключение, связанное с олицетворением (см. Ниже). Я вошел в систему как один и тот же пользователь домена на обеих клиентских машинах и использую ту же информацию о пользователе домена в коде.

Я проверил Просмотр событий на стороне сервера и другие журналы, чтобы увидеть, есть ли какое-то явное различие в том, как запрос обрабатывается на сервере, и проделал значительную часть поиска в Google без успеха.

Кто-нибудь может подсказать, что искать или какую диагностику я могу запустить (на клиентских машинах или на сервере), чтобы определить, почему это происходит?

Спасибо за любую помощь! Martin

2011-08-10 22: 35: 39,478 [10] WARN - ActionRestartIIS: исключение, перезапускающее IIS System.Reflection.TargetInvocationException: исключение было брошенный целью вызова. ---> System.Runtime.InteropServices.COMException (0x80070542): Либо требуемый уровень олицетворения не был предоставлен, или предоставленный уровень олицетворения недействителен. (Исключение из HRESULT: 0x80070542) --- Конец внутренней трассировки стека исключений --- в System.DirectoryServices.DirectoryEntry.Invoke (String methodName, Object [] args)

1 Ответ

0 голосов
/ 12 августа 2011

В этой прекрасной традиции отвечать на свои вопросы, вот что я узнал. Я изменил свой код, чтобы использовать классы System.Management, и они, кажется, работают лучше в разных доменах. Пример кода ниже:

ConnectionOptions connectionOptions = new ConnectionOptions ();

connectionOptions.Authority = "ntlmdomain:" + this.domain;

connectionOptions.Username = this.username; connectionOptions.Password = this.password;

connectionOptions.EnablePrivileges = true;

connectionOptions.Authentication = AuthenticationLevel.PacketPrivacy;

ManagementScope managementScope = новый ManagementScope (@ "\" + this.iisserver + @ "\ root \ microsoftiisv2", connectionOptions);

managementScope.Connect ();

ManagementObject appPool = новый ManagementObject (managementScope, новый ManagementPath ("IISApplicationPool.Name = 'W3SVC / AppPools /" + apppool + "'"), нулевой);

appPool.InvokeMethod ("Recycle", null, null);

...