【问题标题】:Start and Stop APP Pool Using Powershell on Remote Machine在远程机器上使用 Powershell 启动和停止 APP 池
【发布时间】:2016-11-29 14:58:55
【问题描述】:

我正在尝试让 PowerShell 在提供凭据后停止并启动远程计算机上的 AppPool。

启动应用程序池的功能:

Function fnStartApplicationPool([string]$appPoolName)
{
  import-module WebAdministration
   if((Get-WebAppPoolState $appPoolName).Value -ne 'Started')
   {
      Start-WebAppPool -Name $appPoolName
   }
}

停止应用程序池的功能:

Function fnStopApplicationPool([string]$appPoolName)
{
  import-module WebAdministration
   if((Get-WebAppPoolState $appPoolName).Value -ne 'Stopped')
   {
      Stop-WebAppPool -Name $appPoolName
   }
}

我的代码不起作用:

 if ($pathback -eq $false) 
   { 
      #Copying Data from Source to Destination
      copy-Item  -Recurse $backupsrc -Destination $backupdes 
      write-host "Backup Successful" 

      #Validating the apppool value
      import-module WebAdministration 
      if((Get-WebAppPoolState $appPoolName).Value -ne 'Stopped') 
      {
        #Stop apppool       
        Stop-WebAppPool -Name $appPoolName 
        write-host "AppPool Stopped Successfully"
      }
      #Copying Data from Source to Destination

      #Start apppool
      Start-WebAppPool -Name $appPoolName 
      write-host "AppPool Started Sucessfully"
      cd c:\  
   } 

【问题讨论】:

  • 那么当您尝试该解决方案时发生了什么?您是否收到任何错误消息或脚本根本无法运行?
  • 它工作得很好,但现在我在每台服务器上单独手动运行它例如:-我想从服务器 A 停止服务器 B 中的应用程序池。所以我认为我需要提供一些信誉?如何做到这一点
  • 如果您的帐户在两台服务器上都拥有权限,则无需传递凭据。只需创建一个接受$appPoolName 参数的脚本块,将您的函数放入其中,然后遍历运行invoke-command 的服务器列表并传递您的脚本块和应用程序池名称。
  • 我刚刚更新了最后一个功能,请检查
  • 好的。这些更改都不会改变我为您列出的在多台服务器上运行脚本的方法。将您拥有的任何代码包装在一个脚本块中,并使用 invoke-command 在多个服务器上运行它。

标签: powershell iis-7 powershell-2.0


【解决方案1】:

要远程运行脚本,您必须确保 PS-Remoting 已启用。

  1. 右键单击 Windows PowerShell 快捷方式并选择以管理员身份运行,以管理员身份启动 Windows PowerShell。

  2. WinRM 服务默认配置为手动启动。您必须将启动类型更改为自动并在您要使用的每台计算机上启动该服务。在 PowerShell 提示符下,您可以使用以下命令验证 WinRM 服务是否正在运行: 获取服务 winrm 如果服务没有运行,请通过Start-Service winrm

  3. 使其运行
  4. 要配置 Windows PowerShell 以进行远程处理,请键入以下命令:

启用-PSRemoting –force

  1. 要启用身份验证,您需要将远程计算机添加到 WinRM 中本地计算机的受信任主机列表中。为此,请输入:

winrm s winrm/config/client '@{TrustedHosts="RemoteComputer"}'

  1. 通过在远程主机上运行以下命令来验证远程主机上的服务是否正在运行并且正在接受请求:

winrm 快速配置

此命令分析和配置 WinRM 服务。

在您的情况下,您必须在 ServerB 中执行所有这些操作,因为 ServerB 必须信任 ServerA。

完成这些后,您可以从 ServerA 运行以下脚本。我在脚本本身中添加了某些点供您参考。您可以根据需要更改占位符。

# Embedding the password in the script.
# If you do not have a domain creds, then use the username and password directly.

$MyDomain='MyDomain' ;
$MyClearTextUsername='Username' ;
$MyClearTextPassword='Password' ;
$MyUsernameDomain=$MyDomain+'\'+$MyClearTextUsername;
$SecurePassword=Convertto-SecureString –String $MyClearTextPassword –AsPlainText –force ;
$MyCreds=New-object System.Management.Automation.PSCredential $MyUsernameDomain,$SecurePassword ;

# Placing the script under a ScriptBlock
$MyScriptblock={param($appPoolName,$pathback)
# Since you have mentioned that it is working fine locally, I am not checking this part. Assuming its fine.
# Defining the functions as Global. So that you can use it anywhere although I am putting in the scriptblock.
# Make sure the module is present in the remote system. It should be cause you have already mentioned it is working fine when you are running from that system.
        Function fnStartApplicationPool([string]$appPoolName)
                            {
      import-module WebAdministration
       if((Get-WebAppPoolState $appPoolName).Value -ne 'Started')
       {
          Start-WebAppPool -Name $appPoolName
       }
        }
        Function fnStopApplicationPool([string]$appPoolName)
                            {
      import-module WebAdministration
       if((Get-WebAppPoolState $appPoolName).Value -ne 'Stopped')
       {
          Stop-WebAppPool -Name $appPoolName
       }
        }
                if ($pathback -eq $false) 
                   { 
                      #Copying Data from Source to Destination
                      copy-Item  -Recurse $backupsrc -Destination $backupdes 
                      write-host "Backup Successful" 

                      #Validating the apppool value
                      import-module WebAdministration 
                      if((Get-WebAppPoolState $appPoolName).Value -ne 'Stopped') 
                      {
                        #Stop apppool       
                        Stop-WebAppPool -Name $appPoolName 
                        write-host "AppPool Stopped Successfully"
                      }
                      #Copying Data from Source to Destination

                      #Start apppool
                      Start-WebAppPool -Name $appPoolName 
                      write-host "AppPool Started Sucessfully"
                      cd c:\  
                   } 

        }

# As you want to Stop the App pool in Server B from Server A.
# run the script under server A and provide the Server B creds

$result=Invoke-Command -ComputerName 'ServerB' -Credential $MyCreds -ScriptBlock $MyScriptblock -ArgumentList $appPoolName,$pathback ;
$result ;

如果您对答案感到满意,请随意点赞并接受对他人也有帮助的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多