2

我一直在研究 Microsoft.Web.Administration.dll 和 ServerManager 类,试图控制我们的 Windows Server 2008 IIS 7 实例。

我已启用远程管理,并且可以通过 IIS 远程管理工具进行连接。但是,当我尝试使用以下内容时,我无法连接:

ServerManager.OpenRemote(serverName);

此类不允许我像 IIS 远程管理员工具那样在远程 IIS 7 服务器上指定用户名和密码。

这一切都是通过我们使用NAnt的构建过程调用的。

作为CI设置的一部分,其他人如何控制他们的远程 IIS 7 服务器?

4

3 回答 3

3

您需要在有权更改配置文件的域用户(Active Directory 用户)下运行应用程序。

Windows 身份验证将完成剩下的工作。

于 2011-03-29T20:12:18.093 回答
1

正如Oded 所说,您需要 Active Directory 才能使用ServerManager.

假设您有管理员RDP访问服务器,还有一种替代方法是在构建脚本中使用WinRM和远程 PowerShell(与最新版本的 WinRM 随附的 PowerShell 2.0 配合使用效果最佳):

Windows 远程管理命令行工具 (Winrm.cmd)

为不在域中的两台机器快速配置 WinRM:

客户:

winrm quickconfig(只是说是)
winrm 设置 winrm/config/Client/Auth '@{Basic="true"}'
:: 如果不使用 HTTPS,则只执行下一行
winrm 设置 winrm/config/Client '@{AllowUnencrypted="true"}'
winrm 设置 winrm/config/Client '@{TrustedHosts="hostname_or_ip"}'

服务器:

winrm quickconfig(只是说是)
winrm 设置 winrm/config/Service/Auth '@{Basic="true"}'

:: 参见:http://support.microsoft.com/kb/2019527 关于 https
winrm 快速配置-传输:https

:: 只有在不使用 HTTPS 并且您对发送凭据感到满意时才执行此操作
:: 明文。
winrm 设置 winrm/config/Service '@{AllowUnencrypted="true"}'

现在有一些警告。WinRM 将在 Windows 防火墙中为侦听器的端口 5985 和 5986 打一个洞(如果运行Windows Server 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
协议版本:http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
产品供应商:微软公司
ProductVersion:操作系统:6.1.7600 SP:0.0 堆栈:2.0

接下来是连接到远程 PowerShell 会话:

Enter-PSSession <server_name_or_ip_address> -Authentication default -Credential $cred

如果这成功了,您应该在远程计算机上有一个 PowerShell 提示符。

然后,您可以使用远程 PowerShell 加载适用于 PowerShell 的 WebAdministration Provider 并根据您的心意操作 IIS 的许多方面:

适用于 Windows PowerShell 的 Web 管理 (IIS) 提供程序

要连接到远程服务器,您需要提供一个PSCredential对象。如上所述,您将使用以下方法提供此内容:

$cred = Get-Credential

但是,这总是需要通过键盘进行一些交互来提供用户名和密码。显然,这对自动化 CI 没有好处。

但是,您可以将密码存储在文件中。为此,只需运行一次(或每当密码更改时):

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 (archive.org)

无论如何,一旦你连接到远程服务器,你可以发出进一步的命令,例如:

Import-Module WebAdministration
CD IIS:\Sites

等等。

如果这台机器面向互联网并且访问的唯一方法是通过互联网,则应谨慎处理上述大部分内容。如果是这种情况,请考虑将 WinRM 端口仅限于 VPN。

于 2011-03-29T22:07:34.447 回答
1

最后我写了一个WCF服务,作为服务运行在远程机器上。该服务在具有管理员权限的本地帐户下运行,因此可以更改该计算机上的本地 IIS 实例。

在我的 NAnt 脚本中,我有一系列与 WCF 服务通信并根据需要更改 IIS 设置的自定义任务。

由于这是一个内部开发环境,我不太关心安全性,我被允许对 IIS 进行的实际更改是非常基本的。

于 2011-06-01T17:09:15.567 回答