У меня есть консольное приложение, которое использует Microsoft.Web.Administration для удаленного управления IIS на удаленном сервере (я использовал это https://stackoverflow.com/questions/22458410/credentials-for-servermanager-openremote - изменены свойства ahadmin, открыт TCP-порт 135. Я также использовал олицетворение). Все работает нормально - я могу удаленно создавать сайты и пулы приложений и так далее.
Но когда я пытаюсь сделать то же самое в приложении ASP.NET MVC 4, я получаю такую ошибку:
System.Runtime.InteropServices.COMException: получение фабрики классов COM для удаленного компонента с CLSID {2B72133B-3F5B-4602-8952-803546CE3344} с компьютера «remoteServerIP» не удалось из-за следующей ошибки: 80040154 «remoteServerIP».
Я знаю, что многие люди получают эту ошибку, и я видел много сообщений об этом, но у меня ничего не работало. Я попытался переключить свое приложение MVC на целевую платформу X86 (https://stackoverflow.com/questions/1036856/retrieving-the-com-class-factory-for-component-with-clsid-xxxx-failed-due-to-t?rq=1), на удаленном компьютере я включил полные разрешения для HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ CLSID {2b72133b-3f5b-4602-8952-803546ce3344} и HKEY_CLASSES_ROOT \ CLSID {2b72133b-3f5953-46035} для учетной записи, которая m, используя для выдачи себя за другое лицо. Проблема, кажется, в некоторой разнице между MVC и консольными приложениями, но я не могу понять, что это такое.
У меня Windows 7 x64, удаленный сервер - windows server 2008 R2 x64. На обеих машинах есть IIS 7.5.
Я нашел решение. Проблема заключалась в том, что в моем приложении MVC использовалась неправильная версия Microsoft.Web.Administration.dll.
Когда я отлаживал консольное приложение, я смог получить список сайтов из локального IIS, используя этот код.
ServerManager serverManager = new ServerManager();
и список сайтов из удаленных IIS, использующих этот код
ServerManager serverManager = ServerManager.OpenRemote("remoteServerIpAddress");
и все было ОК. Затем я поместил точно такой же код в приложение MVC, и когда я попытался получить список сайтов с удаленного IIS, я получил исключение из вопроса. При попытке получить список сайтов из локального IIS я получил сайты из IIS Express. Диспетчер серверов, похоже, подключается к IIS Express вместо полноценного IIS, но сначала я не обратил на это особого внимания. К сожалению.
Случайно я обнаружил, что этот пост Microsoft.Web.Administration.ServerManager ищет в неправильном каталоге для IISExpress applicationHost.config, откуда я узнал, что
Если приложение, в котором вы используете Microsoft.Web.Administration ..., работает на IISExpress, оно всегда будет откатиться к Microsoft.Web.Administration версии 7.9.0.0 из-за перенаправления сборки в aspnet.config в IIS. экспресс.
Я использовал IIS Express для отладки, и он перенаправил меня на неправильную версию Microsoft.Web.Administration.dll - 7.9.0.0, и мне потребовался 7.0.0.0, который используется полным IIS. Итак, я разместил свое приложение MVC на полном локальном IIS, отладил его там, и оно сработало! Я успешно получил список сайтов с удаленного IIS. Надеюсь, это кому-то поможет.