IIS7 удаленное администрирование через C#
Я изучал Microsoft.Web.Administration.dll и класс ServerManager, пытаясь управлять нашим экземпляром Windows Server 2008 IIS7.
Я включил удаленное администрирование и могу подключиться через инструмент удаленного администрирования IIS, однако, когда я пытаюсь использовать следующее, я не могу подключиться:
ServerManager.OpenRemote(serverName);
Этот класс не позволяет мне указывать имя пользователя и пароль на удаленном сервере IIS7, как это делает инструмент удаленного администрирования IIS.
Все это вызывается через наш процесс сборки с использованием NAnt.
Как другие контролируют свой удаленный сервер IIS7 как часть их конфигурации CI?
3 ответа
В конце я написал службу WCF, которая работает на удаленной машине как служба. Служба работает под локальной учетной записью с правами администратора, поэтому можно изменить локальный экземпляр IIS на этом компьютере.
Из моего сценария NAnt у меня есть ряд пользовательских задач, которые взаимодействуют со службой WCF и меняют настройки IIS по мере необходимости.
Поскольку это внутренняя среда разработки, меня не слишком беспокоит безопасность, и реальные изменения в IIS, которые мне разрешены, являются очень простыми.
Вам нужно будет запустить приложение от имени пользователя домена (пользователя Active Directory), у которого есть права на изменение файлов конфигурации.
Проверка подлинности Windows сделает все остальное.
Как говорит Одед, вам нужен Active Directory, чтобы иметь возможность открыть соединение с удаленным сервером, используя ServerManager
,
Предполагая, что у вас есть сервер доступа RDP администратора, есть альтернатива, которая заключается в использовании WinRM и Remote PowerShell (лучше всего работает с PowerShell 2.0, который поставляется с последней версией WinRM) в ваших сценариях сборки:
Средство командной строки для удаленного управления Windows (Winrm.cmd)
Чтобы быстро настроить WinRM для двух машин, не входящих в домен:
Клиент:
winrm quickconfig (просто скажите да) winrm set winrm/config/Client/Auth '@{Basic="true"}':: Делайте эту следующую строку, только если не используете HTTPS winrm set winrm/config/Client '@{AllowUnencrypted="true"}' winrm set winrm/config/Client '@{TrustedHosts="hostname_or_ip"}'
Сервер:
winrm quickconfig (просто скажите да) winrm set winrm/config/Service/Auth '@{Basic="true"}':: См.: http://support.microsoft.com/kb/2019527 относительно https winrm quickconfig -transport:https:: Делайте это, только если не используете HTTPS И вы рады отправке учетных данных:: открытым текстом winrm set winrm/config/Service '@{AllowUnencrypted="true"}'
Теперь есть несколько предостережений. WinRM пробьет дыру в брандмауэре Windows для портов 5985 и 5986 для прослушивателя (если под управлением Windows 2003 он будет использовать порты 80 и 443). Это может не понравиться вам, и вам, вероятно, лучше поговорить с администраторами сети о том, как это обезопасить.
После настройки WinRM вам потребуется настроить учетную запись пользователя на удаленном сервере, который является членом группы администраторов. После этого вы можете проверить. На сервере сборки:
# the following line will prompt for a username and password, enter the name of the account
# you just configured on the IIS box
$cred = Get-Credential
# next test the connection
Test-WSMan -ComputerName <server_name_or_ip> -Authentication default `
-Credential $cred
Если все хорошо, вы должны увидеть следующий ответ:
wsmid: http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.x SD ProtocolVersion: http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd ProductVendor: корпорация Майкрософт ProductVersion: ОС: 6.1.7600 SP: 0.0, стек: 2.0
Далее нужно подключиться к удаленному сеансу PowerShell:
Enter-PSSession <server_name_or_ip> -Authentication default -Credential $cred
Если это успешно, у вас должно быть приглашение PowerShell на удаленной машине.
Используя Remote PowerShell, вы можете загрузить поставщика WebAdministration для PowerShell и манипулировать многими аспектами IIS для своего сердца:
Поставщик веб-администрирования (IIS) для Windows PowerShell
Для подключения к удаленному серверу необходимо предоставить PSCredential
объект. Как упомянуто выше, вы бы предоставили это используя
$cred = Get-Credential
Однако это всегда требует некоторого взаимодействия с клавиатурой для предоставления имени пользователя и пароля. Очевидно, что это не годится для автоматизированной КИ.
Однако вы можете сохранить пароль в файле. Чтобы сделать это, выполните следующее только один раз (или всякий раз, когда пароль изменяется):
read-host -assecurestring | convertfrom-securestring | out-file C:\securestring.txt
Затем, когда вам нужно создать свой PSCredential
аутентифицироваться на удаленном сервере:
$username = "deployment_user"
$password = cat C:\securestring.txt | convertto-securestring
$cred = new-object -typename System.Management.Automation.PSCredential `
-argumentlist $username, $password
$serverNameOrIp = "192.168.1.1"
Enter-PSSession $serverNameOrIp -Authentication default -Credential $cred
Вышеприведенный скрипт был взят из следующей записи в блоге, но я продублировал, чтобы сохранить здесь на случай, если статья погаснет:
Использование PSCredentials без приглашения - GeeksWithBlogs
В любом случае, после подключения к удаленному серверу вы можете выполнять следующие команды, такие как:
Import-Module WebAdministration
CD IIS:\Sites
И так далее.
К большинству вышеперечисленного следует подходить с осторожностью, если этот аппарат подключен к Интернету и единственный доступ к нему осуществляется через Интернет. Если это так, рассмотрите возможность ограничения портов WinRM только для VPN.