Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288

Параллельное удаление профилей на удаленных рабочих станциях

14.03.2018, 04:32. Показов 2253. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В продолжение темы которая уже была

Есть скрипт который удаляет профили пользователей на удалённых компах

PowerShell
1
2
3
4
5
6
7
8
9
10
11
$OU = "OU=computers,dc=domain,dc=ru"
 
foreach($comp in Get-ADComputer -Filter {Name -like 'comp*'} -SearchBase $OU | ? name -ne 'comp00' | select -ExpandProperty DNSHostName)
{
    if (Test-Connection $comp -Quiet -Count 2)
    {
        Write-Host $comp -f Yellow
        Invoke-Command -ScriptBlock {& 'C:\DelProf2.exe' /q} -ComputerName $comp
    }
    else {Write-Host "$comp not available!" -f Red}
}
Подскажите как сделать, если это возможно, используя скрипт выше, чтобы профиле удалялись на всех серверах в контейнере параллельно, а не по очереди. Знаю что есть функция Workflow.

 Комментарий модератора 
Используйте кнопки языков программирования, в данном случае [PSHЕLL]
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.03.2018, 04:32
Ответы с готовыми решениями:

Создать список ПО на рабочих станциях во всём лесу
Добрый день! У меня небольшая проблема с написанием скрипта, да и вообще хотелось бы услышать совета от более опытных людей, чем я. Задача,...

Запуск скрипта в доменной сети на рабочих станциях до логона
Доброго дня! Подскажите, уважаемые гуру, как запускать скрипт/батник при старте на каждой машине в домене до логона пользователя, под...

Администрирование удаленных рабочих станций
Добрый день.Такой вопрос начал изучать системное адмнистрирование, прочитал книгу Windows Internals посвященную внутреннему устройству...

16
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
14.03.2018, 10:37
Лучший ответ Сообщение было отмечено Dimasik1989 как решение

Решение

Цитата Сообщение от Dimasik1989 Посмотреть сообщение
Подскажите как сделать, если это возможно, используя скрипт выше, чтобы профиле удалялись на всех серверах в контейнере параллельно, а не по очереди. Знаю что есть функция Workflow.
PowerShell
1
2
$OU = "OU=computers,dc=domain,dc=ru"
Invoke-AsWorkflow -Expression 'C:\DelProf2.exe /q' -PSComputerName (Get-ADComputer -Filter {Name -like 'comp*'} -SearchBase $OU | ? name -ne 'comp00').DNSHostName
Добавлено через 16 минут
или вариант параллельной обработки с использованием Start-Job

PowerShell
1
2
3
4
5
$OU = "OU=computers,dc=domain,dc=ru"
$scriptblock = {Invoke-Command -ScriptBlock {& 'C:\DelProf2.exe' /q} -ComputerName $args}
Get-Job | Remove-Job
Get-ADComputer -Filter {Name -like 'comp*' -and Name -ne 'comp00'} -SearchBase $OU | % {Start-Job -Scriptblock $scriptblock -ArgumentList $_.DNSHostName}
Get-Job | Wait-Job | Receive-Job; Get-Job
1
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
14.03.2018, 13:12  [ТС]
KDE777, всё отлично работает. А по первому скрипту, есть возможность чтобы после выполнения в консоль выводилось на каких компах удачно завершено удаление (зелёным), а какие компы были не доступны в процессе выполения (красным)?

Добавлено через 1 час 47 минут
т.е. и Write-Host "$comp successful" -f green и Write-Host "$comp not available!" -f Red если вообще конечно реально запихать в этот скрипт.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
14.03.2018, 14:09
Лучший ответ Сообщение было отмечено Dimasik1989 как решение

Решение

Цитата Сообщение от Dimasik1989 Посмотреть сообщение
есть возможность чтобы после выполнения в консоль выводилось на каких компах удачно завершено удаление (зелёным), а какие компы были не доступны в процессе выполения (красным)
Вот один из вариантов, который параллельно проверяет WinRM доступность, а затем список всех доступных ПК передаёт в Invoke-AsWorkflow. Если окажется, что не будет разрешений для WinRM подключения, тогда ошибку выдаст уже Invoke-AsWorkflow

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
workflow TestWSMan
{
    $OU = "OU=computers,dc=domain,dc=ru"
    foreach -parallel ($DNSHostName in (Get-ADComputer -Filter {Name -like 'comp*' -and Name -ne 'comp00'} -SearchBase $OU).DNSHostName)
    {
        if (Test-WSMan -ComputerName $DNSHostName -EA SilentlyContinue) {$DNSHostName}
        else {"$DNSHostName - not available"}
    }
}
 
$computers = TestWSMan; $computers
Invoke-AsWorkflow -Expression 'C:\DelProf2.exe /q' -PSComputerName ($computers -notmatch 'not available$')
1
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
16.03.2018, 14:37  [ТС]
KDE777, работает супер! Сейчас чтобы удалить профили на компах в разных OU, я ставлю коменты, а можно как нибудь сделать так чтобы компы из всех этих OU попадали в один список?

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
workflow TestWSMan
{
    #$OU = "OU=computers1,dc=domain,dc=ru"; $serv = '*comp*'; $serv00 = '*comp00'
    #$OU = "OU=computers2,dc=domain,dc=ru"; $serv = '*compik*'; $serv00 = '*compik00'
      $OU = "OU=computers3,dc=domain,dc=ru"; $serv = '*cmp*'; $serv00 = '*cmp00'
 
 
    foreach -parallel ($DNSHostName in (Get-ADComputer -Filter {Name -like $serv -and Name -NotLike $serv00 } -SearchBase $OU).DNSHostName)
    {
        if (Test-WSMan -ComputerName $DNSHostName -EA SilentlyContinue) {$DNSHostName}
        else {"$DNSHostName - not available"}
    }
}
 
$computers = TestWSMan; $computers
Invoke-AsWorkflow -Expression 'C:\DelProf2.exe /q' -PSComputerName ($computers -notmatch 'not available$')
Добавлено через 31 минуту
На контейнер уровня выше нельзя, потому что туда уже будут входить компы на которых нельзя удалять профили, поэтому нужны только те, которые указаны в скрипте.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
16.03.2018, 14:47
Лучший ответ Сообщение было отмечено Dimasik1989 как решение

Решение

Цитата Сообщение от Dimasik1989 Посмотреть сообщение
а можно как нибудь сделать так чтобы компы из всех этих OU попадали в один список?
Можно сделать примерно так:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
workflow TestWSMan
{
 
$items =  
@{OU = "OU=computers1,dc=domain,dc=ru"; serv = '*comp*';   serv00 = '*comp00'},
@{OU = "OU=computers2,dc=domain,dc=ru"; serv = '*compik*'; serv00 = '*compik00'},
@{OU = "OU=computers3,dc=domain,dc=ru"; serv = '*cmp*';    serv00 = '*cmp00'}
 
    foreach -parallel ($item in $items)
    {
        $sample1 = $item.serv
        $sample2 = $item.serv00
        
        foreach -parallel ($DNSHostName in (Get-ADComputer -Filter {Name -like $sample1 -and Name -NotLike $sample2 } -SearchBase $item.OU).DNSHostName)
        {
            if (Test-WSMan -ComputerName $DNSHostName -EA SilentlyContinue) {$DNSHostName}
            else {"$DNSHostName - not available"}
        }
    }
 
}
 
$computers = TestWSMan; $computers
Invoke-AsWorkflow -Expression 'C:\DelProf2.exe /q' -PSComputerName ($computers -notmatch 'not available$')
1
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
19.03.2018, 04:38  [ТС]
Супер!!! Спасибо!

Добавлено через 1 час 29 минут
А сделать подсветку для хостов зелёным которые доступные и красным - недоступные можно как нибудь?
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
19.03.2018, 09:53
Цитата Сообщение от Dimasik1989 Посмотреть сообщение
А сделать подсветку для хостов зелёным которые доступные и красным - недоступные можно как нибудь?
Неужели, даже такую мелочь вы не попробовали сделать сами?

PowerShell
1
$computers | sort | %{if ($_ -like '*not available'){Write-Host $_ -f Red}else{Write-Host $_ -f Green}}
1
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
28.04.2018, 05:16  [ТС]
KDE777, небольшой вопросик. Если при выполнении скрипта контроллер домена будет недоступен и командлет Get-ADComputer выполнится с ошибкой, то как сделать чтобы скрипт не выполнялся? Ниже правильно?

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
try{
 
workflow TestWSMan
{
 
$items =  
@{OU = "OU=computers1,dc=domain,dc=ru"; serv = '*comp*';   serv00 = '*comp00'},
@{OU = "OU=computers2,dc=domain,dc=ru"; serv = '*compik*'; serv00 = '*compik00'},
@{OU = "OU=computers3,dc=domain,dc=ru"; serv = '*cmp*';    serv00 = '*cmp00'}
 
    foreach -parallel ($item in $items)
    {
        $sample1 = $item.serv
        $sample2 = $item.serv00
        
        foreach -parallel ($DNSHostName in (Get-ADComputer -Filter {Name -like $sample1 -and Name -NotLike $sample2 } -SearchBase $item.OU).DNSHostName)
        {
            if (Test-WSMan -ComputerName $DNSHostName -EA SilentlyContinue) {$DNSHostName}
            else {"$DNSHostName - not available"}
        }
    }
 
}
 
$computers = TestWSMan; $computers
Invoke-AsWorkflow -Expression 'C:\DelProf2.exe /q' -PSComputerName ($computers -notmatch 'not available$')
 
}catch {Write-Host "Ошибка при выполнение Get-ADComputer!"}
Добавлено через 1 час 17 минут
Просто в идеале бы хотелось, чтобы при возникновении ошибки приходило уведомление по почте

PowerShell
1
catch {$mErr = $_.exception.message; Send-MailMessage -To "proverka@domain.com" -Subject "Ошибка выполния скрипта" -Body " `n$mErr" -Priority High -SmtpServer $smtpServer -From $emailFrom -Encoding $encoding}
0
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
17.01.2019, 07:46  [ТС]
Подскажите, а для выше написанного скрипта можно сделать, чтобы кусок

PowerShell
1
2
3
4
$items =  
@{OU = "OU=computers1,dc=domain,dc=ru"; serv = '*comp*';   serv00 = '*comp00'},
@{OU = "OU=computers2,dc=domain,dc=ru"; serv = '*compik*'; serv00 = '*compik00'},
@{OU = "OU=computers3,dc=domain,dc=ru"; serv = '*cmp*';    serv00 = '*cmp00'}
выполнялся через Swith? Т.е.

PowerShell
1
2
3
4
swith(Read-host "ведите имя компьютера"){
"comp1" {$items = @{OU = "OU=computers1,dc=domain,dc=ru"; serv = '*comp*';   serv00 = '*comp00'}}
"comp2"{$items = @{OU = "OU=computers2,dc=domain,dc=ru"; serv = '*compik*'; serv00 = '*compik00'}}
}
У меня не получается. может через данную функцию вообще этого нельзя делать?
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
17.01.2019, 10:06
Цитата Сообщение от Dimasik1989 Посмотреть сообщение
У меня не получается.
Потому что нет никакого swith, а есть switch
0
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
17.01.2019, 10:12  [ТС]
Прошу прощения. Опечатался. Но всё равно не получается
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
17.01.2019, 10:19
Цитата Сообщение от Dimasik1989 Посмотреть сообщение
Но всё равно не получается
Что именно?

PowerShell
1
2
3
4
5
6
7
8
9
cls; $items = $null
 
switch (Read-host "ведите имя компьютера")
{
"comp1" {$items = @{OU = "OU=computers1,dc=domain,dc=ru"; serv = '*comp*';   serv00 = '*comp00'}}
"comp2" {$items = @{OU = "OU=computers2,dc=domain,dc=ru"; serv = '*compik*'; serv00 = '*compik00'}}
}
 
$items
Code
1
2
3
4
5
6
7
8
9
10
11
ведите имя компьютера: comp1
 
Name                           Value
----                           -----
OU                             OU=computers1,dc=domain,dc=ru
serv00                         *comp00
serv                           *comp*
 
 
 
PS C:\Temp>
0
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
17.01.2019, 10:43  [ТС]
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
workflow TestWSMan
{
 
switch(Read-host "ведите имя компьютера")
    {
 
    "comp1" {$items = @{OU = "OU=computers1,dc=domain,dc=ru"; serv = '*comp*';   serv00 = '*comp00'}}
    "comp2" {$items = @{OU = "OU=computers2,dc=domain,dc=ru"; serv = '*compik*'; serv00 = '*compik00'}}
 
    } 
 
    foreach -parallel ($item in $items)
    {
        $sample1 = $item.serv
        $sample2 = $item.serv00
        
        foreach -parallel ($DNSHostName in (Get-ADComputer -Filter {Name -like $sample1 -and Name -NotLike $sample2 } -SearchBase $item.OU).DNSHostName)
        {
            if (Test-WSMan -ComputerName $DNSHostName -EA SilentlyContinue) {$DNSHostName}
            else {"$DNSHostName - not available"}
        }
    }
 
}
 
$computers = TestWSMan; $computers
Invoke-AsWorkflow -Expression 'C:\DelProf2.exe /q' -PSComputerName ($computers -notmatch 'not available$')
И всё подчеркнуто красным((
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
17.01.2019, 10:54
Цитата Сообщение от Dimasik1989 Посмотреть сообщение
И всё подчеркнуто красным
А посмотреть причину подчёркивания очень трудно?



И потом, добавлять Read-host в workflow, предназначенное для одновременного выполнения на нескольких устройствах, по моему, это безумная идея...
0
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
17.01.2019, 10:59  [ТС]
Можно как то исправить скрипт чтобы работало? Потому что тогда приходится комментить

PowerShell
1
2
"comp1" {$items = @{OU = "OU=computers1,dc=domain,dc=ru"; serv = '*comp*';   serv00 = '*comp00'}}
   # "comp2" {$items = @{OU = "OU=computers2,dc=domain,dc=ru"; serv = '*compik*'; serv00 = '*compik00'}}
Добавлено через 52 секунды
Ошибся, вот так

PowerShell
1
2
3
4
$items =  
@{OU = "OU=computers1,dc=domain,dc=ru"; serv = '*comp*';   serv00 = '*comp00'}
#@{OU = "OU=computers2,dc=domain,dc=ru"; serv = '*compik*'; serv00 = '*compik00'},
#@{OU = "OU=computers3,dc=domain,dc=ru"; serv = '*cmp*';    serv00 = '*cmp00'}
0
17.01.2019, 11:02

Не по теме:

Цитата Сообщение от Dimasik1989 Посмотреть сообщение
Можно как то исправить скрипт чтобы работало? Потому что тогда приходится комментить
Наведите порядок в AD и не придётся ничего комментировать...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.01.2019, 11:02
Помогаю со студенческими работами здесь

Удаление профилей на серверах
Нужен скрипт который при помощи программы Delprof будет удалять профиля на машинах, которые расположены контейнере AD. В контейнере машины...

Удаление старых профилей по EmployeeID в AD
На сервере установлена программа, когда пользователи заходят в неё через терминальную сессию, создаются профили на втором диске D. На диске...

Неправильное время на рабочих станциях
Добрый день! Прошу помочь с настройкой времени. У всех рабочих станций домена время отстает на 9 минут. Буду очень признателен!

Слетело подключение к интернету на нескольких рабочих станциях
Добрый вечер уважаемые форумчане !!! Прошу помощи - может быть кто нибудь сталкивался. есть контроллер домена , шлюз - на разных...

Размещение исполняемых файлов на сервере и их исполнение на рабочих станциях
1.Где прочесть об этом? 2.Возникла необходимость исполнять программу размещенную на сервере на рабочих станциях. Но что грозит когда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru