2011-01-27 68 views
5

我需要迭代IIS應用程序的所有身份驗證模式並禁用除一個之外的所有身份驗證模式。如何在PowerShell中迭代App IIS7的身份驗證

類似:

foreach($itm in [collection of authentication modes for app]){ 
if([certain authentication]){enabled = true}else{enabled = false}} 

我熟悉的Set-WebConfigurationProperty。

回答

13

您可以通過調用get-WebConfiguration遍歷所有本地(以及任何安裝的第三方)爲給定網站的根Web應用程序的認證方式:

$siteName = "MySiteName" 

$authentications = Get-WebConfiguration ` 
        -filter "system.webServer/security/authentication/*" ` 
        -PSPath "IIS:\Sites\$siteName" 

您也可以重複驗證模式對於網站中的任何給定的Web應用程序(甚至特定文件)。以下檢索的認證方式爲所謂的「\ foo」的一個人爲的web應用程序:

$authentications = Get-WebConfiguration ` 
        -filter "system.webServer/security/authentication/*" ` 
        -PSPath "IIS:\Sites\$siteName\foo" 

的SectionPath屬性可用於檢查的認證方式,例如:

$authentications | foreach {$_.SectionPath} 

,其輸出:

/system.webServer/security/authentication/digestAuthentication 
/system.webServer/security/authentication/anonymousAuthentication 
/system.webServer/security/authentication/iisClientCertificateMappingAuthentication 
/system.webServer/security/authentication/basicAuthentication 
/system.webServer/security/authentication/clientCertificateMappingAuthentication 
/system.webServer/security/authentication/windowsAuthentication 

你可能會認爲你可以在你的foreach循環中做這樣簡單的事情......

$authentications | ` 
foreach { $_.Enabled = $_.SectionPath.EndsWith('\windowsAuthentication') } 

...但有一個問題。它不起作用。它實際上不會因錯誤而失敗,但它也不會改變任何事情。

這是因爲驗證部分被鎖定。要在鎖定部分更改設置,則需要建立呼叫WebConfigurationProperty和包括-Location參數,例如,

Set-WebConfigurationProperty ` 
-filter "/system.webServer/security/authentication/windowsAuthentication" ` 
-name enabled -value true -PSPath "IIS:\" -location $siteName 

我想你還是可以通過管道將對象傳遞給ForEach對象cmdlet,但它可能會如果你使用foreach循環編寫腳本,讀起來更容易(並且維護)。

$siteName = "MySiteName" 

$authentications = Get-WebConfiguration ` 
        -filter "system.webServer/security/authentication/*" ` 
        -PSPath "IIS:\Sites\$siteName" 

foreach ($auth in $authentications) 
{ 
    $auth.SectionPath -match "/windowsAuthentication$" 
    $enable = ($matches.count -gt 0) 

    Set-WebConfigurationProperty ` 
    -filter $auth.SectionPath ` 
    -name enabled -value $enable -PSPath "IIS:\" -location $siteName 
}