2014-12-30 3 views
0

Я пытаюсь написать сценарий, который будет проходить через весь локальный веб-сайт IIS и обновлять их учетные записи физического пути всякий раз, когда я вынужден обновлять свой пароль домена.Обновление учетных данных WebSite IIS 6 через powershell

следующие работы ... первый раз, когда вы запустите его ...

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 по-прежнему показывает старое имя пользователя в интерфейсе пользователя и учетные данные не в состоянии.

Поэтому, естественно, я попытался установить эти дополнительные 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

Уф, наконец, нашли команда работает. В целом я пробовал 4 разных варианта одной и той же вещи из разных примеров вокруг interwebz, все из которых работают только в первый раз. Но эта команда обновляет должным образом на последующих изменений:

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