Перезапускать удаленный пул приложений IIS из командной строки?

Можно ли перезапустить пул приложений IIS7 из командной строки на другом компьютере?

Я нашел APPCMD (appcmd recycle apppool my-app-pool), но он работает только на хосте, на котором он запущен, AFAICT.

Я слышал слух, что есть способ сделать это с Powershell, но я ничего не знаю об этом, и я, очевидно, не очень хорош в поиске.

Я использую Vista / Server 2008, если это имеет значение.

РЕДАКТИРОВАТЬ: Я нашел что-то под названием WinRM, что кто-то утверждает, что может запустить сам APPCMD, но я пока не уверен, как именно.

6 ответов

Кен, если это запускается из CMD, вы можете сделать это с помощью PSExec. Это не требует установки на сервер, к которому вы хотите получить доступ.

Просто скопируйте содержимое zip в ваш файл System32 (не включая файл ELUA или DLL) компьютера, который вы хотите удаленно ОТ.
Затем введите CMD
тип
Psexec \\{Computer Name of ISS7 Server} %systemroot%\System32\inetsrv\appcmd recycle apppool my-app-pool

Если вы не находитесь в одном домене с учетной записью администратора домена, вам потребуется ввести учетные данные для административного доступа. Для получения дополнительной информации просто введите psexec в командной строке без аргументов.

Чтобы сделать это удаленно из PowerShell, вам нужно либо использовать удаленное взаимодействие PowerShell, либо использовать WMI.

На самом деле это очень просто с помощью командлета Invoke-WMIMethod PowerShell, но вы должны указать -Authentication PacketPrivacy... и если вам нужно указать разные учетные данные, вы можете сделать это с параметром -Credential (Get-Credential)... вот пример:

$pc = "serverName"

## List the app pools, note the __RELPATH of the one you want to kill:
Get-WMIObject IISApplicationPool 
              -Computer $pc 
              -Namespace root\MicrosoftIISv2 
              -Authentication PacketPrivacy 

## Recycle a specific one:
$Name = "W3SVC/APPPOOLS/ASP.NET v4.0 Classic"  ## This is the Name from above
$Path = "IISApplicationPool.Name='$Name'"      ## This is the __RELPATH

Invoke-WMIMethod Recycle 
                 -Path $Path 
                 -Computer $pc 
                 -Namespace root\MicrosoftIISv2 
                 -Authentication PacketPrivacy

Я написал хорошую функцию, чтобы обернуть все это: http://poshcode.org/2466

Если командная строка - ваш выбор, PsExec кажется решением, но для критически важных задач я бы не рекомендовал это. Причина в следующем: PsExec имеет проблемы с несколькими запусками.

Я предпочитаю использовать API для таких целей.

  1. WMI сделает работу, как описано здесь (мое любимое решение).
  2. В качестве альтернативы вы можете использовать ServerManager API. Это позволяет управлять пулами приложений на удаленной машине, если вы запускаете код с соответствующими учетными данными.

Аналогично ответу @Jeff, с Powershell remoting это будет:

Enter-PSSession -ComputerName <your server> -Credential <username, or (Get-Credential)>

Затем в интерактивном сеансе, затем:

appcmd recycle apppool my-app-pool

перезапустить пул приложений.

Перезапустите AppPool в PowerShell

В этом примере: MSExchangeSyncAppPool

$appPool = Get-WmiObject -Authentication PacketPrivacy -Impersonation Impersonate -ComputerName (hostname) -namespace "root/MicrosoftIISv2" -class IIsApplicationPool | Where-Object {$_.Name -eq "W3SVC/AppPools/MSExchangeSyncAppPool" }
$appPool.Recycle()

Для полноты картины существует также поставщик услуг ADSI для IIS (предупреждение: устаревшая технология):

      $ComputerName = 'webserver01.local'
$AppPool = 'MyWebPortalPool'

# Load System.DirectoryServices assembly if not already loaded:
if (-not ([System.Management.Automation.PSTypeName]'System.DirectoryServices.DirectoryEntry').Type) {
    Add-Type -AssemblyName System.DirectoryServices
}

$PoolPath = "IIS://$ComputerName/W3SVC/AppPools/$AppPool"

$PoolObj = New-Object System.DirectoryServices.DirectoryEntry($PoolPath)
$PoolObj.Invoke('Recycle', $null)

$PoolObj.Dispose()
Другие вопросы по тегам