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

Удаление старых профилей по EmployeeID в AD

25.12.2017, 12:01. Показов 5478. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На сервере установлена программа, когда пользователи заходят в неё через терминальную сессию, создаются профили на втором диске D. На диске D три папки с профилями: admins, users, controllers, в них и находятся папки с профилями. Наименование папки - это имя пользователя в AD. Профиль представляет собой набор конфигурационных файлов.

Нужен скрипт который будет брать название папки( т.е. username) далее смотрит в AD, если есть такой пользователь и его атрибут EmployeeID равен 55555, то удалять этот профиль с диска D.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.12.2017, 12:01
Ответы с готовыми решениями:

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

Удаление профилей отключённых учёток
Всем доброй ночи! Очень нужна ваша помощь! Задача следующая: Есть заблокированные учётки пользователей. Есть их профили, размещённые...

Параллельное удаление профилей на удаленных рабочих станциях
В продолжение темы которая уже была Есть скрипт который удаляет профили пользователей на удалённых компах $OU =...

18
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
25.12.2017, 12:05  [ТС]
Скрин с атрибутом
Миниатюры
Удаление старых профилей по EmployeeID в AD  
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.12.2017, 12:25
Лучший ответ Сообщение было отмечено Dimasik1989 как решение

Решение

Цитата Сообщение от Dimasik1989 Посмотреть сообщение
Нужен скрипт который будет брать название папки( т.е. username) далее смотрит в AD, если есть такой пользователь и его атрибут EmployeeID равен 55555, то удалять этот профиль с диска D
Допустим название папки = AD-атрибуту SamAccountName, тогда примерно так (PowerShell 3 и выше):

PowerShell
1
2
3
4
5
foreach ($folder in Get-ChildItem D:\admins,D:\users,D:\controllers -Directory)
{
    $user = $folder.Name
    if (Get-ADUser -Filter{SamAccountName -eq $user -and EmployeeID -eq '55555'} -Properties EmployeeID) {Remove-Item -Path $folder.FullName -Recurse -Force -WhatIf}
}
1
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
25.12.2017, 14:24  [ТС]
Проверил, работает!!! Можете ещё добавить в скрипт? если пользователя нет в AD то тоже удалять папку
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.12.2017, 14:36
Лучший ответ Сообщение было отмечено Dimasik1989 как решение

Решение

Цитата Сообщение от Dimasik1989 Посмотреть сообщение
если пользователя нет в AD то тоже удалять папку
PowerShell
1
2
3
4
5
6
foreach ($folder in Get-ChildItem D:\admins,D:\users,D:\controllers -Directory)
{
    $user = $folder.Name
    $ADUser = Get-ADUser -Filter{SamAccountName -eq $user} -Properties EmployeeID
    if (!$ADUser -or $ADUser.EmployeeID -eq '55555') {Remove-Item -Path $folder.FullName -Recurse -Force -WhatIf}
}
1
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
25.12.2017, 14:41  [ТС]
KDE777, большое Вам спасибо.
0
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
10.02.2018, 15:07  [ТС]
Подскажите, а как к данному скрипту добавить ещё и удаление локального профиля на машине по C:\users\$ADUser ?
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
11.02.2018, 13:39
Лучший ответ Сообщение было отмечено Dimasik1989 как решение

Решение

Цитата Сообщение от Dimasik1989 Посмотреть сообщение
удаление локального профиля на машине по C:\users\$ADUser
Для удаления профилей, лично я использую очень удобную утилиту DelProf2

PowerShell
1
DelProf2.exe /id:"C:\Users\$($ADUser.SamAccountName)" /p
1
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
14.02.2018, 12:09  [ТС]
Да, всё как надо, спасибо! У меня последний вопрос. Тестировал скрипт на двух серверах. На одном забыл включить RSAT. Скрипт выполнялся от доменного пользователя. И в результате в $ADUser ничего не записалось и все профили в этих папках удалились. Можно как нибудь это обойти, т.е. если контроллер домена будет не доступен или командлет Get-ADUser будет выдавать ошибку, то не выполнять условия для удаления профилей?

Добавлено через 7 минут
Понятно что можно просто установить RSAT, но это на всякий случай чтобы избежать подобной халатной ситуации.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
14.02.2018, 12:25
Цитата Сообщение от Dimasik1989 Посмотреть сообщение
Да, всё как надо, спасибо! У меня последний вопрос. Тестировал скрипт на двух серверах. На одном забыл включить RSAT. Скрипт выполнялся от доменного пользователя. И в результате в $ADUser ничего не записалось и все профили в этих папках удалились. Можно как нибудь это обойти, т.е. если контроллер домена будет не доступен или командлет Get-ADUser будет выдавать ошибку, то не выполнять условия для удаления профилей?
Проверяем наличие ActiveDirectory PS-модуля:

PowerShell
1
2
if (Get-Module -ListAvailable ActiveDirectory) {if (!(Get-Module -Name ActiveDirectory)) {Import-Module -Name ActiveDirectory}}
else {Write-Host "PS Modele ActiveDirectory not Available!"; break}
+ на всякий случай проверяем, что переменная $ADUser не пустая:

PowerShell
1
if ($ADUser.SamAccountNam) {DelProf2.exe /id:"C:\Users\$($ADUser.SamAccountName)" /p}
Цитата Сообщение от Dimasik1989 Посмотреть сообщение
Скрипт выполнялся от доменного пользователя. И в результате в $ADUser ничего не записалось и все профили в этих папках удалились.
А как это вышло, если я специально показал DelProf2.exe с ключом /p, т.е. (Prompt for confirmation before deleting each profile)?
0
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
14.02.2018, 13:35  [ТС]
А локальные профили в C:\Users\ и не удалились. Удалились только в папках которые перечислены в начале скрипта.

Добавлено через 3 минуты
А если !$ADUser пользователя в Ad нет, пользователь по условию тоже должен удаляться, и в переменную $ADUser ничего не запишется, то получается if ($ADUser.SamAccountNam) {DelProf2.exe /id:"C:\Users\$($ADUser.SamAccountName)" /p} не совсем правильно наверно?
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
14.02.2018, 13:49
Цитата Сообщение от Dimasik1989 Посмотреть сообщение
Подскажите, а как к данному скрипту добавить ещё и удаление локального профиля на машине по C:\users\$ADUser ?
Цитата Сообщение от Dimasik1989 Посмотреть сообщение
А если !$ADUser пользователя в Ad нет, пользователь по условию тоже должен удаляться, и в переменную $ADUser ничего не запишется, то получается if ($ADUser.SamAccountNamе) {DelProf2.exe /id:"C:\Users\$($ADUser.SamAccountName)" /p} не совсем правильно наверно?
Что спрашивали, то я и показал. Откуда возьмётся логин (SamAccountName) локального пользователя в переменной $ADUser, в которую попадает результат выполнения Get-ADUser?

Добавлено через 3 минуты
Цитата Сообщение от Dimasik1989 Посмотреть сообщение
А локальные профили в C:\Users\ и не удалились. Удалились только в папках которые перечислены в начале скрипта.
DelProf2.exe - предназначена для корректного удаления профилей Windows пользователей, использовать её для удаления каких либо других папок не нужно.
0
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
14.02.2018, 13:52  [ТС]
Я неправильно сформулировал вопрос.
Если пользователя нет в AD
if (!$ADUser -or $ADUser.EmployeeID -eq '55555') {Remove-Item -Path $folder.FullName -Recurse -Force -WhatIf}
} удаляется папки с именем такого пользователя в D:\admins,D:\users,D:\controllers
а как его скриптом удалить из C:\Users\ Поточу что принцип такой, если есть профиль в этих папках то и локальный с таким же именем лежит в C:\Users\
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
14.02.2018, 14:09
Цитата Сообщение от Dimasik1989 Посмотреть сообщение
Если пользователя нет в AD
if (!$ADUser -or $ADUser.EmployeeID -eq '55555') {Remove-Item -Path $folder.FullName -Recurse -Force -WhatIf}
} удаляется папки с именем такого пользователя в D:\admins,D:\users,D:\controllers
а как его скриптом удалить из C:\Users\ Поточу что принцип такой, если есть профиль в этих папках то и локальный с таким же именем лежит в C:\Users\
PowerShell
1
2
3
4
5
6
7
8
9
10
foreach ($folder in Get-ChildItem D:\admins,D:\users,D:\controllers -Directory)
{
    $user = $folder.Name
    $ADUser = Get-ADUser -Filter{SamAccountName -eq $user} -Properties EmployeeID
    if (!$ADUser -or $ADUser.EmployeeID -eq '55555')
    {
        Remove-Item -Path $folder.FullName -Recurse -Force -WhatIf
        C:\Utils\DelProf2.exe /id:"C:\Users\$user" /p
    }
}
0
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
14.02.2018, 14:13  [ТС]
А можете в данный скрипт вставить сточки из 10 сообщения? Я затрудняюсь.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
14.02.2018, 14:23
Цитата Сообщение от Dimasik1989 Посмотреть сообщение
А можете в данный скрипт вставить сточки из 10 сообщения? Я затрудняюсь.
Проверка наличия AD-модуля? Просто добавляете эти 2 строчки в начало.

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
if (Get-Module -ListAvailable ActiveDirectory) {if (!(Get-Module -Name ActiveDirectory)) {Import-Module -Name ActiveDirectory}}
else {Write-Host "PS Modele ActiveDirectory not Available!"; break}
 
foreach ($folder in Get-ChildItem D:\admins,D:\users,D:\controllers -Directory)
{
    $user = $folder.Name
    $ADUser = Get-ADUser -Filter{SamAccountName -eq $user} -Properties EmployeeID
    if (!$ADUser -or $ADUser.EmployeeID -eq '55555')
    {
        Remove-Item -Path $folder.FullName -Recurse -Force -WhatIf
        C:\Utils\DelProf2.exe /id:"C:\Users\$user" /p
    }
}
1
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
14.02.2018, 14:46  [ТС]
А если контроллер домена отвалился в этот момент и при выполнении командлета Get-ADUser будет ошибка, то как тогда быть? Т.е. при наличие ошибки что бы удаление папок не выполнялось.

Добавлено через 8 минут
Просто я рассматриваю варианты по которым Get-ADUser может не выполниться
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
14.02.2018, 15:15
Цитата Сообщение от Dimasik1989 Посмотреть сообщение
Просто я рассматриваю варианты по которым Get-ADUser может не выполниться
Хочу напомнить, что у вас одно из условий удаления - SamAccountName равный имени папки не найден в AD, т.е. $ADUser пустая. Однако, если хотите застраховаться именно от ошибки при выполнение Get-ADUser, тогда делается это так:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (Get-Module -ListAvailable ActiveDirectory) {if (!(Get-Module -Name ActiveDirectory)) {Import-Module -Name ActiveDirectory}}
else {Write-Host "PS Modele ActiveDirectory not Available!"; break}
 
foreach ($folder in Get-ChildItem D:\admins,D:\users,D:\controllers -Directory)
{
    $user = $folder.Name
    try
    {
        $ADUser = Get-ADUser -Filter{SamAccountName -eq $user} -Properties EmployeeID -EA Stop
        if (!$ADUser -or $ADUser.EmployeeID -eq '55555')
        {
            Remove-Item -Path $folder.FullName -Recurse -Force -WhatIf
            C:\Utils\DelProf2.exe /id:"C:\Users\$user" /p
        }
    }
    catch {Write-Host "Ошибка при выполнение Get-ADUser!" -f Red; $_.exception.message}
}
И ещё поиск в AD по SamAccountName может ничего не дать, т.к. этот атрибут может быть переименован, а вот папка профиля останется со старым именем. Т.е. в AD пользователя по SamAccountName не нашли, тем не менее владелец у этого профиля есть.
1
0 / 0 / 0
Регистрация: 12.06.2016
Сообщений: 288
15.02.2018, 07:52  [ТС]
KDE777, спасибо Вам за помощь! Всё супер!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.02.2018, 07:52
Помогаю со студенческими работами здесь

Удаление старых файлов
Доброго времени суток ув. форумчане! Говорю сразу в шеле я профан полный!:( В общем поставили задачу - килять старые бэкапы которые...

Удаление старых записей
Этот php- запрос правильно написан чтоб удалить все записи из таблицы mail ее поля time которые старше 1 суток? $sql2 =...

Удаление старых логов
в каталоге /logs/ создаются файлы server.log.2012-04-23 и так каждый день переполняя при этом дисковое пространство. как написать скрипт...

Удаление старых дат
В столбце А, начиная со второй строчки имеются названия. В столбце Е - даты их созднаия. Необходим макрос, который удалит все те строки,...

Удаление старых файлов
Создать программу удалял файлы старше N дней в определённой папке. 1 Надо все данные ввести из клавиатуры 1.1 Путь к файлу 1.2 Дата...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru