Как создать виртуальный каталог IIS с помощью общего сетевого ресурса с WMI - PullRequest
2 голосов
/ 14 мая 2009

Мне нужно создать виртуальный каталог на сайте IIS, указывающий на общий сетевой ресурс \\ servername \ sharename \ directory , и мне нужно указать конкретного пользователя для сквозной аутентификации.

Я выполняю сценарий WMI, который я собираюсь вызвать из сценария Powershell.

Хотя целевой средой IIS является IIS7 (корень пространства имен WMI / WebAdministration), я бы предпочел использовать классы WMI, совместимые с IIS6 (root \ MicrosoftIISv2), поскольку остальная часть сценария уже работает с IIS6.

Я знаю, что, вероятно, могу сделать это с помощью командлетов PowerShell IIS7 или appcmd, но я пытаюсь поддерживать совместимость с IIS6.

Ответы [ 4 ]

4 голосов
/ 17 декабря 2013
## Settings
$siteName = 'Default Web Site'
$virtualDirectoryName = 'Test'
$physicalPath = '\\UNC-path'

## Init
$virtualDirectoryPath = "IIS:\Sites\$siteName\$virtualDirectoryName"

## Create Virtual Directory where physicalpath is an UNC-path (New-WebVirtualDirectory wont do)
New-Item $virtualDirectoryPath -type VirtualDirectory -physicalPath $physicalPath

## Change 'Connect As' settings (New-WebVirtualDirectory don't include Username and Password)
##userName must have the N capitalized
Set-ItemProperty $virtualDirectoryPath -Name userName -Value 'UserName'
Set-ItemProperty $virtualDirectoryPath -Name password -Value 'Password'

## Status
Get-Item -Path $virtualDirectoryPath | fl *
2 голосов
/ 14 мая 2009

Вот две альтернативные функции powershell, которые я придумал. Я бы предпочел вторую функцию, которая использует только WMI, но дефект ошибки Powershell WMI меня раздражал настолько, что я прибег к использованию интерфейса ADSI. Оба включены для справки.

function CreateUNCVirtualDirectory(
    [string]$siteName = $(throw "Must provide a Site Name"),
    [string]$vDirName = $(throw "Must provide a Virtual Directory Name"),
    [string]$uncPath = $(throw "Must provide a UNC path"),
    [string]$uncUserName = $(throw "Must provide a UserName"),
    [string]$uncPassword = $(throw "Must provide a password")
    ) {

    $iisWebSite = Get-WmiObject -Namespace 'root\MicrosoftIISv2' -Class IISWebServerSetting -Filter "ServerComment = '$siteName'"

    $objIIS = new-object System.DirectoryServices.DirectoryEntry("IIS://localhost/" + $iisWebSite.Name + "/Root")
    $children = $objIIS.psbase.children
    $vDir = $children.add($vDirName,$objIIS.psbase.SchemaClassName)
    $vDir.psbase.CommitChanges()
    $vDir.Path = $uncPath
    $vDir.UNCUserName = $uncUserName
    $vDir.UNCPassword = $uncPassword
    $vDir.psbase.CommitChanges()
}

function CreateUNCVirtualDirectory2(
    [string]$siteName = $(throw "Must provide a Site Name"),
    [string]$vDirName = $(throw "Must provide a Virtual Directory Name"),
    [string]$uncPath = $(throw "Must provide a UNC path"),
    [string]$uncUserName = $(throw "Must provide a UserName"),
    [string]$uncPassword = $(throw "Must provide a password")
    ) {

    $iisWebSite = Get-WmiObject -Namespace 'root\MicrosoftIISv2' -Class IISWebServerSetting -Filter "ServerComment = '$siteName'"

    $virtualDirSettings = [wmiclass] "root\MicrosoftIISv2:IIsWebVirtualDirSetting"
    $newVDir = $virtualDirSettings.CreateInstance()
    $newVDir.Name = ($iisWebSite.Name + '/ROOT/' + $vDirName)
    $newVDir.Path = $uncPath
    $newVDir.UNCUserName = $uncUserName
    $newVDir.UNCPassword = $uncPassword

    # Call GetType() first so that Put does not fail.
    # http://blogs.msdn.com/powershell/archive/2008/08/12/some-wmi-instances-can-have-their-first-method-call-fail-and-get-member-not-work-in-powershell-v1.aspx
    Write-Warning 'Ignore one error message:Exception calling "GetType" with "0" argument(s): "You cannot call a method on a null-valued expression."'
    $newPool.GetType()

    $newVDir.Put();
    if (!$?) { $newVDir.Put() }
}
2 голосов
/ 14 мая 2009
1 голос
/ 14 декабря 2011

Пожалуйста, обратитесь по следующей ссылке для получения объектов с использованием пространства имен «root \ WebAdministration», используемого IIS7 в Windows 2008: http://discovery.bmc.com/confluence/display/Configipedia/Microsoft+Internet+Information+Services

Код для проверки состояния веб-сайта и пула приложений на сервере Windows 2008 с помощью WMI:

Public Sub WebsiteAppPoolStatusCheckIISv7(ByVal computer As String, ByVal userName As String, ByVal password As String)
    Dim thisServer = System.Configuration.ConfigurationManager.AppSettings("ThisServer")
    Dim excludedWebSiteOrAppPool = System.Configuration.ConfigurationManager.AppSettings("ExcludedWebSiteOrAppPool")
    Dim WbemAuthenticationLevelPktPrivacy = 6
    Dim objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
    Dim objWMIService As Object
    If (computer = thisServer) Then
        objWMIService = objSWbemLocator.ConnectServer(computer, "root/WebAdministration")
    Else 'for remote servers
        objSWbemLocator.Security_.AuthenticationLevel = WbemAuthenticationLevelPktPrivacy
        objWMIService = objSWbemLocator.ConnectServer(computer, "root/WebAdministration", userName, password)
    End If
    'Code Start for Website status check
    Dim websites = objWMIService.ExecQuery("SELECT * FROM Site")
    For Each website As WbemScripting.SWbemObject In websites
        Dim WebSiteName = website.Name
        Dim webSiteStatus As String
    If (Convert.IsDBNull(website.GetState)) Then
            webSiteStatus = "Unknown"
        Else
            Select Case website.GetState
                Case 0
                    webSiteStatus = "Starting"
                Case 1
                    webSiteStatus = "Running"
                Case 2
                    webSiteStatus = "Stopping"
                Case 3
                    webSiteStatus = "Stopped"
                Case Else
                    webSiteStatus = "Unknown"
            End Select
        End If
    logFile.writeline("Server:= " & computer & ", WebSiteName:= " & WebSiteName & ", Status:= " & webSiteStatus)
    Next
    'Code Start for App pool status check
    Dim appPools As WbemScripting.SWbemObjectSet
    appPools = objWMIService.ExecQuery("Select * from ApplicationPool")
    'Iterate all the appPools of the server
    For Each appPool As WbemScripting.SWbemObject In appPools
        Dim appPoolName = appPool.Name
        Dim appPoolStatus As String
        If (Convert.IsDBNull(appPool.GetState)) Then
            appPoolStatus = "Unknown"
        Else
            Select Case appPool.GetState
                Case 0
                    appPoolStatus = "Starting"
                Case 1
                    appPoolStatus = "Running"
                Case 2
                    appPoolStatus = "Stopping"
                Case 3
                    appPoolStatus = "Stopped"
                Case Else
                    appPoolStatus = "Unknown"
            End Select
        End If
    logFile.writeline("Server:= " & computer & ", AppPoolName:= " & appPoolName & ", Status:= " & appPoolStatus)
    Next
End Sub 

...