Как можно ускорить работу скрипта, добавляющего нового локального пользователя на доменных компьютерах и назначающего его членом локальной группы администраторов? Хочу переделать скрипт, чтобы он работал многопоточно и выполнял задачу быстрее. ОС в домене разнообразна: от Windows 7/WS2008R2 до Windows 10/WS2019.
Для создания скрипта на PowerShell, который будет выполняться в нескольких потоках, можно использовать модуль `PowershellWorkflow`. Вот пример такого скрипта:
```powershell
Import-Module PSWorkflow
workflow MyWorkflow {
param($computerNames)
foreach -parallel ($computer in $computerNames) {
inlinescript {
# Ваш код для выполнения на каждом компьютере
# Например, добавление пользователя в группу администраторов
$username = "newuser"
$computername = $using:computer
$groupname = "Administrators"
$computer = [ADSI]("WinNT://" + $computername + ",computer")
$group = $computer.PSBase.Children.Find($groupname, "group")
$user = $computer.PSBase.Children.Find($username, "user")
if($group -ne $null -and $user -ne $null) {
$group.Add($user.Path)
}
}
}
}
# Пример вызова скрипта
$computerNames = @("computer1", "computer2", "computer3")
MyWorkflow -computerNames $computerNames
```
Чтобы ускорить работу скрипта, можно выполнить задачу многопоточно. В этом случае каждый поток будет работать над своим компьютером одновременно. Это позволит ускорить обработку и уменьшить время выполнения задачи.
Самое простое - Start-Job, оно есть везде, начиная с 3.0
но оно памяти жрёт и использует процессы, а не потоки. по быстрому, на десяток-другой компов - сойдёт.
Многопоточное:
Всё это (модули/скрипты) требует установки на админский комп для запуска задач в стиле
Потом можно посмотреть результаты работы
Get-RSJob | Receive-RSJob
а уже внутри Invoke-MyCommand будет выполняться что-то, что лезет удалённо и делает там свои дела
Но вот это Invoke-MyCommand - если это внешняя функция, а не просто набор действий, требует дополнительного "проталкивания" в поток. Примеры есть
Другие модули работают аналогично, со своими нюансами, естественно