Операции службы Windows на нескольких удаленных серверах параллельно

У меня есть 3 сервера в одной сети и с одинаковым именем пользователя и паролем для входа в систему, на которых я хочу выполнить следующие операции:

*Check if Service1 is running or not
*If it is running, stop the service 
*Set Service1 to disable mode 
*If it is not running, do nothing
*Check if Service2 is running 
*If it is running, stop the service 
*Set Service2 to disable mode 
*If it is not running, do nothing

и так далее для Service3, .. 4, .. 5 ...

Я хочу создать файл Master.bat на 1-м сервере, который должен выполнять указанные выше операции на всех 3-х серверах параллельно.

Я пытаюсь сделать это ниже, но не понимаю, как я могу сделать это для более чем 1 службы в том же коде, а также его немного длиннее. Есть ли какой-либо другой короткий способ сделать это в пакетном режиме или в PowerShell?

original_serverlist.txt:

Server1
Server2
Server3

Код:

copy original_serverlist.txt serverlist.txt

:repeat
set currentserver=
for /f "eol=; tokens=1*" %%i in (serverlist.txt) do set currentserver=%%i
if "%currentserver%"=="" goto end

for /F "tokens=3 delims=: " %%H in ('SC query Service1 ^| findstr "        STATE"') do (
  if /I "%%H" "RUNNING" (
  net stop Service1
  echo Service1 stopped @ %date% %time% > C:\result.txt 
  sc config Service1 start= disabled
  echo Service1 set disabled @ %date% %time% >> C:\result.txt 
  )
)

type serverlist.txt| find /v "%currentserver%"> serverlist1.txt
copy serverlist1.txt serverlist.txt
goto repeat

:end
del serverlist.txt
del serverlist1.txt

ИЗМЕНИТЬ1

Мне не так комфортно в PS, как в пакетном, но я хочу изучить вещи, поэтому помещаю здесь свое точное требование, чтобы узнать, как реализовать его в PowerShell с объяснением кода.

Мне нужно выполнить следующий набор операций на всех трех удаленных серверах параллельно (Server1, Server2, Server3) с Master.ps1 на Server1:

run command  cmd /c iisreset/stop and set IIS service to Disabled mode
Stop service1 and set it to Disabled mode
Stop service2 and set it to Disabled mode
Stop service3 and set it to Disabled mode
Kill process jusched.exe
Kill process conhost.exe

person Sunny    schedule 09.11.2013    source источник
comment
какое влияние имеет %currentserver%? Вы определяете это, но никогда не используете.   -  person Endoro    schedule 09.11.2013


Ответы (1)


В PowerShell 3.0

$services = "service1", "service2", "service3"
"server1", "server2", "server3" | % {
        Get-Service -Computer $_ $services | ? State -eq "Running" | Stop-Service -Force -PassThru | Set-Service -StartupType Disabled
}

Вам необходимо включить удаленное взаимодействие с Powreshell, чтобы это работало, и добавить параметр -Credential везде, где вы видите аргумент -Computer, если у вашего текущего пользователя домена недостаточно прав.

Более общий вариант - использовать хэш

$ServiceMap = @{ "server1": ("service11", "service12");
                 "server2": ("service21" ... ) }

Вам также необходимо будет проверить наличие ошибок.

Чтобы добиться параллельного выполнения, вы можете сделать что-то вроде:

workflow set_services {
  param(
    [string[]]$Computers, [string[]]$Services
  )

  foreach -parallel ($computer in $computers) {
    Get-Service -ComputerName $computer $services | ? State -eq "Running" | Stop-Service -Force -PassThru | Set-Service -StartupType Disabled 
  }    
}

Кстати, больше нигде не используйте пакетные скрипты.

person majkinetor    schedule 09.11.2013