Как создать скрипт на PowerShell, который будет выполняться в нескольких потоках?

Как можно ускорить работу скрипта, добавляющего нового локального пользователя на доменных компьютерах и назначающего его членом локальной группы администраторов? Хочу переделать скрипт, чтобы он работал многопоточно и выполнял задачу быстрее. ОС в домене разнообразна: от Windows 7/WS2008R2 до Windows 10/WS2019. 
  • 19 декабря 2023 г. 11:37
Ответы на вопрос 2
Для создания скрипта на 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 - если это внешняя функция, а не просто набор действий, требует дополнительного "проталкивания" в поток. Примеры есть

Другие модули работают аналогично, со своими нюансами, естественно
Похожие вопросы