簡體   English   中英

通過Powershell更新IIS 6網站憑據

[英]Update IIS 6 WebSite Credentials via powershell

我試圖編寫一個腳本,該腳本將遍歷我所有的本地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
}

該代碼不會引發任何錯誤或警告,但是最終結果是相同的,這兩個額外的屬性保持不變。

我正在使用以下代碼來獲取“ $ SiteElement”

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

另外,在腳本結尾處,我使用以下命令重新啟動IIS:

Restart-Service W3SVC

gh,終於找到了一個有效的命令。 總之,我在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM