PDA

Показать полную графическую версию : [решено] Poweshell RunspacePool — Многопоток


rulesss2
03-06-2021, 16:24
Добрый день. Написал код, но не работает с RunspacePool.

$button_OK.Add_Click({

$RunspacePool = [runspacefactory]::CreateRunspacePool(1,8)
$RunspacePool.ApartmentState = "MTA"
$RunspacePool.Open()
$Work = [powershell]::Create().AddScript($scriptblock)
$scriptblock = {
if ($CheckBox_ESPP.Checked){
& C:\PSTools\psexec.exe -h -nobanner -accepteula @C:\comps.txt powershell.exe -inputformat none "Invoke-Expression -Command 'hostname'; Get-Item C:\EASOPS\ESPP\In; Get-Item C:\EASOPS\ESPP\Out"
}
if ($CheckBox_GMMQ.Checked){
& C:\PSTools\psexec.exe -h -nobanner -accepteula @C:\comps.txt powershell.exe -inputformat none "Invoke-Expression -Command 'hostname'; Get-Item C:\GMMQ\Export; Get-Item C:\GMMQ\Import"
}
if ($CheckBox_Size.Checked){
& C:\PSTools\psexec.exe -h -nobanner -accepteula @C:\comps.txt powershell.exe -inputformat none "Invoke-Expression -Command 'hostname'; Get-PSDrive C"
}
}

$Work.RunspacePool = $RunspacePool
$Work.BeginInvoke()

$RunspacePool.Close() | Out-Null
$RunspacePool.Dispose() | Out-Null
})

Подскажите, пожалуйста, что я сделал не так?

rulesss2
11-06-2021, 09:00
Столько просмотров, ни кто не знает?

YuS_2
11-06-2021, 09:11
ни кто не знает? »
Сформулируйте задачу, а не вопрос "почему не работает", тогда, возможно, что-то подскажут.
И код обрамляйте специальными тегами...

DJ Mogarych
11-06-2021, 09:21
Зачем с пауэршеллом использовать psexec? У него есть свои механизмы удалённого запуска.

https://docs.microsoft.com/ru-ru/powershell/scripting/learn/remoting/running-remote-commands?view=powershell-7.1

rulesss2
11-06-2021, 09:48
Суть в том, что psexec выполняет код на 51 компьютере по очереди. Через RunspacePool я пытаюсь создать выполнение кода хотя бы на 8 компьютерах одновременно.

Зачем с пауэршеллом использовать psexec? У него есть свои механизмы удалённого запуска. »
Enter-PSSession Не работает. Блокирует антивирус. Возможности управлять им нет, по этому пришлось использовать psexec.

DJ Mogarych
11-06-2021, 11:31
Возможности управлять им нет »
Договориться с теми, кто им управляет?

Invoke-command запускает сразу 32 сессии.

Enter-PSSession Не работает »
Если через psexec на удалённой машине выполнить

winrm -qc

или

powershell -command "Enable-PSRemoting -Force"

, тоже нет?

rulesss2
11-06-2021, 13:07
Все варианты пробовал. Договориться не вариант. Этот код пробовал "Служба WinRM уже настроена на прием запросов на компьютере."

Enter-PSSession : Сбой подключения к удаленному серверу xxxx. Сообщение об ошибке: Клиенту не удается подключит
ься к узлу назначения, указанному в запросе. Убедитесь, что служба на узле назначения работает и принимает запросы. Озн
акомьтесь с журналами и документацией для определения запущенной на узле назначения службы WS-Management (чаще всего эт
о IIS или WinRM). Если это служба WinRM, то для анализа состояния и настройки этой службы используйте на удаленном узле
команду "winrm quickconfig". Подробности см. в разделе справки "about_Remote_Troubleshooting".
строка:1 знак:1
+ Enter-PSSession xxxx
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (xxxx:String) [Enter-PSSession], PSRemotingTransportException
+ FullyQualifiedErrorId : CreateRemoteRunspaceFailed

Ошибка при попытки подключения.

Foreigner
11-06-2021, 13:22
rulesss2, Посмотрите в сторону workflow, который позволяет выполнять код параллельно. Или ставьте PowerShell Core, где у Foreach-Object есть -Parallel и -ThrottleLimit.

То, что вам не позволяет антивирус, это конечно сильно. Он скорее должен ругаться на psexec.

rulesss2
11-06-2021, 13:42
С workflow беда. Не получается добавить в код который написал в первом посте. Если кто-то поможет, буду очень благодарен. На psexec антивирус не ругается. Команды выполняются, просто хочу ускорить процесс выполнения.

Foreigner
11-06-2021, 13:51
Не получается добавить в код который написал в первом посте. »

Откажитесь от него, перепишите с использованием workflows.

Просто сравните время выполнения:

$list = 'ya.ru','google.com','yahoo.com'

workflow Test-Ping
{
param ([string[]] $list)

foreach -parallel ($l in $list)
{
Test-Connection $l -count 2
}
}

Test-Ping $list

rulesss2
15-06-2021, 15:14
Откажитесь от него, перепишите с использованием workflows. »

$computer = Get-Content -Path C:\comps.txt

workflow test {
param ([string[]]$computers)
foreach -parallel ($computer in $computers) {
InlineScript { C:\PSTools\psexec.exe $computer powershell.exe -inputformat none -command "Invoke-Expression -Command 'hostname'; Get-Item C:\EASOPS\ESPP\In; Get-Item C:\EASOPS\ESPP\Out"
}
}
}

Написал так, но ничего не происходит. Подскажите, пожалуйста.

Foreigner
15-06-2021, 16:13
Написал так, но ничего не происходит. Подскажите, пожалуйста. »

1. Я не могу проверить, у меня нет ни psexec.exe, ни других компьютеров
2. В workflow в InlineScript {} необходимо использовать $using ($using:computer) переменную. Попробуйте.
3. Попробуйте без InlineScript {}, прямо в foreach () {}.
4. workflow test необходимо вызвать:


$computers = Get-Content -Path C:\comps.txt

workflow test {
param ([string[]]$computers)
....
}

test $computers




© OSzone.net 2001-2012