我希望这是在正确的地方。我知道这个问题以前被问过很多次,但我找不到我需要的东西。
我正在寻找一个可以同时在多个远程服务器上运行的脚本,以停止正在运行的特定服务并将其设置为手动启动。
那部分是比较简单的部分,我还希望它能反馈给我它正在执行什么任务,然后再次检查服务以确认它已停止并设置为手动。
这是我目前所拥有的。
##Get user credentials
$credtentials = Get-Credential
##Services
$servicename = 'Spooler'
##Server List
$server = 'myserver'
$service = Get-Service -Name $servicename -ComputerName $server
if ($service.StartType -eq 'Automatic') {
$service | Set-Service -StartupType Manual
}
有人可以为此做出贡献吗?
答案1
$Servers
为服务器名称创建一个数组变量( ),并将-ComputerName
其传递给调用命令-ScriptBlock
. 这将针对数组中列出的每台机器运行 PowerShell 逻辑。
这也使用您输入的凭证,并使用该凭证运行脚本块中调用的命令作为针对所有这些服务器的安全上下文。
如果设置为,它将设置StartType
为,如果服务状态为 ,它将停止服务。之后,它将输出远程服务器名称、服务、和。Manual
Automatic
Running
Name
Status
StartType
请注意,这假定您放入变量的凭据$credential
对您运行远程命令的每个服务器具有管理员访问权限;$servers
每次运行相应地调整列表。
电源外壳
$credentials = Get-Credential;
$Servers = "server0004","server0982";
$servicename = 'Spooler';
Invoke-Command -ComputerName $Servers -ScriptBlock {
$service = Get-Service -Name $args[0];
If($service.StartType -eq 'Automatic'){$service | Set-Service -StartupType Manual};
If($service.Status -eq 'Running'){$service | Stop-Service -Force};
$service = Get-Service -Name $args[0];
$service | Select @{n="Server"; e={$env:COMPUTERNAME}}, Status, Name, StartType | FT
} -ArgumentList $servicename -Credential $credentials;
输出
Server Status Name StartType
------ ------ ---- ---------
server0982 Stopped Spooler Manual
Server Status Name StartType
------ ------ ---- ---------
server0004 Stopped Spooler Manual