2014-12-30 35 views
0

我正在尝试编写一个脚本,该脚本将循环遍历所有本地IIS网站,并在我强制更新域密码时更新其物理路径凭据。通过powershell更新IIS 6 WebSite凭证

下面的作品...你运行它第一次......

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

哎,终于找到了命令的作品。总而言之,我已经尝试了来自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