通过powershell更新IIS 6 WebSite凭据

时间:2014-12-30 19:15:24

标签: powershell iis iis-6

我正在尝试编写一个脚本,它将遍历我所有的本地IIS网站,并在我被迫更新域密码时更新其物理路径凭据。

以下作品......第一次运行时......

function Set-Site-Credentials(
    $SiteElement,
    $Credentials
){  
    $SiteElement.virtualDirectoryDefaults.userName = "$($Credentials.Domain)\$($Credentials.UserName)"
    $SiteElement.virtualDirectoryDefaults.password = $Credentials.Password
    $SiteElement | Set-Item -Force
}

运行此操作后,我注意到以下属性也已设置

$SiteElement.userName #Same as was set earlier on .virtualDirectoryDefaults
$SiteElement.password #Same as was set earlier on .virtualDirectoryDefaults

随后,只要我尝试使用上面的代码更新凭据,这两个属性就会保持不变,并且这些更改不会在IIS中生效。

结果是:

$SiteElement.userName #Unchanged
$SiteElement.password #Unchanged
$SiteElement.virtualDirectoryDefaults.userName #New value
$SiteElement.virtualDirectoryDefaults.password #New value

IIS站点仍显示UI中的旧用户名,凭据失败。

很自然地,我尝试在更新函数中设置额外的2个属性:

function Set-Site-Credentials(
    $SiteElement,
    $Credentials
){  
    $SiteElement.userName = "$($Credentials.Domain)\$($Credentials.UserName)"
    $SiteElement.password = $Credentials.Password
    $SiteElement.virtualDirectoryDefaults.userName = "$($Credentials.Domain)\$($Credentials.UserName)"
    $SiteElement.virtualDirectoryDefaults.password = $Credentials.Password
    $SiteElement | Set-Item -Force
}

代码不会抛出任何错误或警告,但最终结果是相同的,这2个额外的属性保持不变。

我使用以下代码获取" $ SiteElement"

$sites = Get-ChildItem IIS:\Sites
$sites | Foreach-Object { Set-Site-Credentials -SiteElement $_ -Credentials $newCredentials }

此外,在脚本结束时,我使用以下命令重新启动IIS:

Restart-Service W3SVC

1 个答案:

答案 0 :(得分:1)

唉,终于找到了一个有效的命令。总而言之,我在interwebz周围的不同示例中尝试了同一事物的4种不同变体,所有这些仅在第一次起作用。但是此命令会在后续更改中正确更新:

function Set-Site-Credentials(
    $SiteElement,
    $Credentials
){  
    Set-WebConfiguration -Filter "$($SiteElement.ItemXPath)/application[@path='/']/virtualDirectory[@path='/']" -Value @{userName="$($Credentials.Domain)\$($Credentials.UserName)"; password="$($Credentials.Password)"}    
}

完整脚本

param (
    [switch]$All,
    [switch]$AllPools,
    [switch]$AllSites,
    [string]$AppPool,
    [string]$Site 
)

Import-Module WebAdministration

function Set-AppPool-Credentials(
    $AppPoolElement,
    $Credentials
){
    Set-ItemProperty $AppPoolElement.PSPath -name processModel -value @{userName="$($Credentials.Domain)\$($Credentials.UserName)";password="$($Credentials.Password)";identitytype=3}
}

function Set-Site-Credentials(
    $SiteElement,
    $Credentials
){  
    Set-WebConfiguration -Filter "$($SiteElement.ItemXPath)/application[@path='/']/virtualDirectory[@path='/']" -Value @{userName="$($Credentials.Domain)\$($Credentials.UserName)"; password="$($Credentials.Password)"}    
}

$newCredentials = (Get-Credential).GetNetworkCredential()

$appPools = Get-ChildItem IIS:\AppPools
$sites = Get-ChildItem IIS:\Sites


if($All -or $AllPools){
    $appPools | Foreach-Object { Set-AppPool-Credentials -AppPoolElement $_ -Credentials $newCredentials }
}
elseif($AppPool){
    $poolElement = ($appPools | Where-Object { $_.name -eq $AppPool })
    Set-AppPool-Credentials -AppPoolElement $poolElement -Credentials $newCredentials
}

if($All -or $AllSites){
    $sites | Foreach-Object { Set-Site-Credentials -SiteElement $_ -Credentials $newCredentials }
}
elseif($Site){
    $siteElement = ($sites | Where-Object { $_.name -eq $Site })
    Set-Site-Credentials -SiteElement $siteElement -Credentials $newCredentials
}

Restart-Service W3SVC