![]() |
скрипт отключения пользователей из Exel в AD через PS
Добрый день, коллеги!
облазил весь интернет, и везде приводятся разные примеры отключения пользователей списком и все то не работают, то со своими параметрами не очень понятными мне. собственно суть проста, что нужно. 1. есть список пользователей в эксель, где есть первая колонка табельный номер, он же EmployeeID и вторая колонка ФИО оно же DisplayName 2. уже смирился, что из самого экселя никто не даёт примера, чтоб отключить список пользователей именно из эксель файла, без перевода в CSV. перевожу в CSV. удалось собрать скрипт, работает без ошибок, определяет и таб.номер и ФИО, но не отключает...есть подозрения что, чего-то не хватает.. вот собственно скрипт ниже.. Скрытый текст
cls
Import-Module ActiveDirectory $Users = Import-Csv "D:\scripts\ps\users.csv" -Delimiter ";" #$Global:count = 0 function disableUser ($EmployeeID, $DisplayName) { Write-Host ('EmployeeID: ' + $EmployeeID) Write-Host ('DisplayName: ' + $DisplayName) $login = (Get-ADuser -Filter {DisplayName -eq $EmployeeID -and Title -eq $DisplayName}).SamAccountName #$Global:count = $Global:count + 1 } function main { foreach($User in $Users) { disableUser $User.EmployeeID $User.DisplayName } } main #Write-Host ('count: ' + $Global:count) Буду благодарен за помощь. |
Цитата:
|
Iska, ну не знаю как там за глаза, но то что мне нужно я вот не нашёл.
|
yuriy.nepomnyashchiy.3@fb, вот прямо готового именно для Вашего конкретного случая с «EmployeeID» и «DisplayName» может и не быть, разумеется.
А так есть и в Script Center, и в отдельных chm-сборниках. Берём и лепим из кирпичиков нечто наподобие такого: Скрытый текст
![]() Код:
Option Explicit |
Iska, спасибо завтра попробую!
|
Iska, подскажите, в данном примере не вижу пути к файлу, с которого провести отключение?
|
yuriy.nepomnyashchiy.3@fb, а там нет пути. Процедура вставляется непосредственно в модуль «ЭтаКнига» той Рабочей книги, на первом листе («Лист1») которой содержится список из двух столбцов с заголовками. Я понял вопрос:
Цитата:
|
Код:
$file = "С:\users.xlsx" |
Kazun, это:
Цитата:
|
Думаю, нет. Но процесс EXCEL , часто остается висеть в процессах, чтобы наверняка :)
|
Kazun, спасибо, ясно.
|
Kazun, это тоже VBA? ну т.е. макрос?
Kazun,это тоже VBA? вроде Get-ADuser это ps команда.. |
Цитата:
|
Kazun, простите за долгое отсутствие, но вот что выдаёт скрипт, запускается в PS
Скрытый текст
EmployeeID: EmployeeID
DisplayName: DisplayName Имя "Get-ADuser" не распознано как имя командлета, функции, файла скрипта или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего повт орите попытку. F:\test2\exel.ps1:11 знак:12 + Get-ADuser <<<< -Filter "EmployeeID -eq '$EmployeeID' -and DisplayName -eq '$DisplayName'" | Disable-ADAccount -Confirm: $false -PassThru + CategoryInfo : ObjectNotFound: (Get-ADuser:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException EmployeeID: 111111 "тут естественно правильный таб №" DisplayName: фио "тут естественно правильная ФИО" Имя "Get-ADuser" не распознано как имя командлета, функции, файла скрипта или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего повт орите попытку. F:\test2\exel.ps1:11 знак:12 + Get-ADuser <<<< -Filter "EmployeeID -eq '$EmployeeID' -and DisplayName -eq '$DisplayName'" | Disable-ADAccount -Confirm: $false -PassThru + CategoryInfo : ObjectNotFound: (Get-ADuser:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException EmployeeID: 111112 "тут естественно правильный таб №" DisplayName: фио "тут естественно правильная ФИО" Имя "Get-ADuser" не распознано как имя командлета, функции, файла скрипта или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего повт орите попытку. F:\test2\exel.ps1:11 знак:12 + Get-ADuser <<<< -Filter "EmployeeID -eq '$EmployeeID' -and DisplayName -eq '$DisplayName'" | Disable-ADAccount -Confirm: $false -PassThru + CategoryInfo : ObjectNotFound: (Get-ADuser:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException Iska, отписался) путь к файлу так же указан верно, пробовал xls и xlsx |
Добавить: Import-Module ActiveDirectory
|
Kazun, не помогло(
файл эксель внутри, имена естественно вымышленные, но в рабочем файлы настоящие ![]() Скрытый текст
скрипт
Import-Module ActiveDirectory $file = "F:\test2\list.xlsx" $ex = New-Object -ComObject Excel.Application $wb = $ex.Workbooks.Open($file) $wb.Worksheets.Item("Лист1").UsedRange.Rows | Foreach { $DisplayName = $_.value2[1,1] $EmployeeID = $_.value2[1,2] Write-Host ('EmployeeID: ' + $EmployeeID) -ForegroundColor Green Write-Host ('DisplayName: ' + $DisplayName) -ForegroundColor Green Get-ADuser-Filter"EmployeeID -eq '$EmployeeID' -and DisplayName -eq '$DisplayName'" | Disable-ADAccount -Confirm:$false -PassThru } $wb.Close() $ex.Quit() Get-Process EXCEL | Stop-Process -Force [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ex) [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb) Remove-Variable ex Remove-Variable wb вывод PS F:\test2> F:\test2\exel.ps1 EmployeeID: EmployeeID DisplayName: DisplayName Имя "Get-ADuser-Filter"EmployeeID -eq `'$EmployeeID`' -and DisplayName -eq `'$DisplayName`'"" не распознано как имя командлета, функции, файла скрипта или выполняемой программы. Проверьте прави льность написания имени, а также наличие и правильность пути, после чего повторите попытку. F:\test2\exel.ps1:13 знак:85 + Get-ADuser-Filter"EmployeeID -eq '$EmployeeID' -and DisplayName -eq '$DisplayName'" <<<< | Disable-ADAccount -Confirm:$false -PassThru + CategoryInfo : ObjectNotFound: (Get-ADuser-Filt...$DisplayName`'":String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException EmployeeID: 653844 DisplayName: Абдулазизова Анна Борисовна Имя "Get-ADuser-Filter"EmployeeID -eq `'$EmployeeID`' -and DisplayName -eq `'$DisplayName`'"" не распознано как имя командлета, функции, файла скрипта или выполняемой программы. Проверьте прави льность написания имени, а также наличие и правильность пути, после чего повторите попытку. F:\test2\exel.ps1:13 знак:85 + Get-ADuser-Filter"EmployeeID -eq '$EmployeeID' -and DisplayName -eq '$DisplayName'" <<<< | Disable-ADAccount -Confirm:$false -PassThru + CategoryInfo : ObjectNotFound: (Get-ADuser-Filt...$DisplayName`'":String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException EmployeeID: 613139 DisplayName: Аксенова Ольга Сергеевна Имя "Get-ADuser-Filter"EmployeeID -eq `'$EmployeeID`' -and DisplayName -eq `'$DisplayName`'"" не распознано как имя командлета, функции, файла скрипта или выполняемой программы. Проверьте прави льность написания имени, а также наличие и правильность пути, после чего повторите попытку. F:\test2\exel.ps1:13 знак:85 + Get-ADuser-Filter"EmployeeID -eq '$EmployeeID' -and DisplayName -eq '$DisplayName'" <<<< | Disable-ADAccount -Confirm:$false -PassThru + CategoryInfo : ObjectNotFound: (Get-ADuser-Filt...$DisplayName`'":String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException 0 0 |
Get-ADuser-Filter"EmployeeID -eq '$EmployeeID' -and DisplayName -eq '$DisplayName'" -Почему команда написана слитно?
|
Kazun, да , Вы были правы. сделал пробел, заработало, но не отключает некоторых пользователей, по ФИО и таб. номеру полное совпадение, список сначала был из двух - всё отключил, но когда список стал из 7 некоторых просто пропускал, я сделал список из тех что он пропустил и он тоже их не отключил, ошибку не выдаёт , но и не отключает, просто их как бы определяет..
таким вот образом выдаёт Скрытый текст
таким вот образом выдаёт EmployeeID: 111111 DisplayName: Иванова Наталия Андреевна EmployeeID: 111112 DisplayName: Петрова Елена Игоревна 0 0 а когда пользователя отключает то выдаёт как надо EmployeeID: 111113 DisplayName: Сидорова Анна Борисовна DistinguishedName : CN=Сидорова Анна Борисовна,OU=Users,OU=xxx,DC=xxx,DC=xxx,DC=ru Enabled : False Name : Сидорова Анна Борисовна ObjectClass : user ObjectGUID : fbf35da2-a1b9-437d-b2d0-a0318c56704a SamAccountName : xxxxx SID : S-1-5-21-2856786560-2810845470-2975245544-85912 UserPrincipalName : ххх@ххх.ххх.ru в чём может быть дело? |
В фильтре, наличие пробелов в строках, несовпадение DisplayName и EmployeeID. Можно попробовать вручную посмотреть результат поиска для проблемных пользователей.
Можно осуществлять поиск, только по EmployeeID: Get-ADuser -Filter "EmployeeID -eq '$EmployeeID'" |
Kazun, проблема была в том что в поле "выводимое имя" у нас принято , если человек сменил ФИО писать его старое ФИО в скобках после ФИО - ну что-то типа "Иванова Мария Ивановна (Сидорова)" :)
искать только по EmployeeID нет смысла т.к. часто бывают ошибки от отдела кадров) хотя тоже надо взять на заметку. ещё один момент если, Вы знаете.. как в отключаемых пользователях применять к ним , т.е. к их почтовым ящикам отправку и получение сообщения в 1кб? ну чтоб письма отправляемые им не увеличивали их п\я в рамках этого скрипта |
Код:
Get-ADuser -Filter "EmployeeID -eq '$EmployeeID' -or DisplayName -like '*$DisplayName*'" Configure message delivery restrictions for a mailbox |
Kazun, спасибо за ссылку, но если Вы поняли что я имел в виду, через консоль я могу установить ограничения на доставку и приём руками, а как это реализовать скриптовой командой?
я хочу отключить пользователя потом граничить ему сообщения в размере один килобайт. в указанной ссылке общие понятия как это сделать на консоли. и да exchange 2010 :) |
Что вызывает сложность щелкнуть раз, на ссылку ниже - Configure storage quotas for a mailbox
Configure message size limits for a mailbox |
Kazun, спасибо! просто не увидел, я прочту и думаю у меня буду вопросы, я ещё не спец в PS , обычно в таких примерах указываются общие положения, но как их сцепить со своим скриптом врятли напишут) если Вы не против я ещё обращусь к Вам)
|
Запускать скрипт в шелле EMS,немного изменив:
Код:
Get-ADuser -Filter "EmployeeID -eq '$EmployeeID' -or DisplayName -like '*$DisplayName*'" | Disable-ADAccount -Confirm:$false -PassThru | Foreach { |
Kazun,
вот что получилось) Скрытый текст
#Загружаем командлеты Exchange
.'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1' Connect-ExchangeServer -auto Import-Module ActiveDirectory $file = "F:\test2\list.xlsx" $ex = New-Object -ComObject Excel.Application $wb = $ex.Workbooks.Open($file) $wb.Worksheets.Item("Лист1").UsedRange.Rows | Foreach { $DisplayName = $_.value2[1,1] $EmployeeID = $_.value2[1,2] Write-Host ('EmployeeID: ' + $EmployeeID) -ForegroundColor Green Write-Host ('DisplayName: ' + $DisplayName) -ForegroundColor Green Get-ADuser -Filter "EmployeeID -eq '$EmployeeID' -and DisplayName -eq '$DisplayName'" | Disable-ADAccount - Confirm:$false -PassThru } $wb.Close() $ex.Quit() Get-Process EXCEL | Stop-Process -Force [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ex) [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb) Remove-Variable ex Remove-Variable wb Get-ADuser -Filter "EmployeeID -eq '$EmployeeID' -or DisplayName -like '*$DisplayName*'" | Disable-ADAccount -Confirm:$false - PassThru | Foreach { Set-Mailbox -Identity $_.UserPrincipalName -MaxSendSize 1kb -MaxReceiveSize 1kb } #логирование 'пока не придумано' вывод PS F:\test2> F:\test2\exel.ps1 Командная консоль Exchange! ПОДРОБНО: Подключение к ххх-хххх.хх.хх.ххх ПОДРОБНО: Подключен к ххх-хххх.хх.хх.ххх EmployeeID: 111111 DisplayName: Иванова Елена Игоревна DistinguishedName : CN=Иванова Елена Игоревна,OU=хх,OU=хх,DC=ххх,DC=ххх,DC=хх Enabled : False Name : Иванова Елена Игоревна ObjectClass : user ObjectGUID : 4eaf706c-01126-4826-93fa-23b49c001323e SamAccountName : ххххх SID : S-1-5-21-2856554560-2831245470-2975245544-169075 UserPrincipalName : ххх@хх.хх.ххх EmployeeID: 111112 DisplayName: Петрова Наталия Андреевна DistinguishedName : CN=Петрова Наталия Андреевна,OU=хх,OU=хх,DC=ххх,DC=ххх,DC=хх Enabled : False Name : Петрова Наталия Андреевна ObjectClass : user ObjectGUID : 9b8a571b-4190-48a9-8de3-4e4680b76e2e SamAccountName : ххххх SID : S-1-5-21-285347560-2810845470-29456544-168656 UserPrincipalName : ххх@хх.хх.ххх 0 0 ПРЕДУПРЕЖДЕНИЕ: Команда выполнена успешно, но параметры 'ххх.ххх.хх/хх/хх/Петрова Наталия Андреевна' не были изменены. отключает их нормально. но меняет размер сообщений только у Петрова Наталия Андреевна , а в файле она последняя в списке из этих двух человек и плюс ещё "Команда выполнена успешно, но параметры 'ххх.ххх.хх/хх/хх/Петрова Наталия Андреевна' не были изменены." что не так :( |
Вместо этого кода:
Код:
Get-ADuser -Filter "EmployeeID -eq '$EmployeeID' -and DisplayName -eq '$DisplayName'" | Disable-ADAccount -Confirm:$false -PassThru Код:
Get-ADuser -Filter "EmployeeID -eq '$EmployeeID' -or DisplayName -like '*$DisplayName*'" | Disable-ADAccount -Confirm:$false -PassThru | Foreach { |
Kazun, Хотел Вас поблагодарить, но извините что поздно) полученные от Вас указания в работе скрипта работают! Спасибо!
но если не трудно, помогите пожалуйста ещё с двумя моментами, необходимо ставить галочку в карточке exсhange пользователя для сокрытия его из адресной книги и ещё необходимо внести в поле дискрипшн в АД комментарий, саму команду я знаю - Descripton 'комментарий' , но куда её вставить не очень понимаю в команде Get-ADuser -Filter "EmployeeID -eq '$EmployeeID' -or DisplayName -like '*$DisplayName*'" | Disable-ADAccount -Confirm:$false -PassThru | Foreach { Set-Mailbox -Identity $_.UserPrincipalName -MaxSendSize 1kb -MaxReceiveSize 1kb } |
Код:
Get-ADuser -Filter "EmployeeID -eq '$EmployeeID' -or DisplayName -like '*$DisplayName*'" | Disable-ADAccount -Confirm:$false -PassThru | Foreach { |
объясните доходчиво, что значит "$_" и вообще не очень понимаю значение знака $, если есть время
|
$_ (доллар и нижнее подчеркивание) — применяется для передачи значения при использовании конвейера. Специальная переменная $_ принимает текущее значение каждого объекта, переданного по конвейеру. Например следующая команда просто выводит по очереди все значения:
′one′, ′two′, ′three′ | foreach {Write-Host $_} ![]() |
Привет друзья.
Нужен такой же скрипт, только имеется дополнительная колонка со статусом пользователя. (Account Status) Нужно так... Когда пользователь находится в статусе Disabled - то отключить его в АД Если пользователь Enabled - то не трогать его. Нужно как бы фильтровать Спасибо |
Время: 19:04. |
Время: 19:04.
© OSzone.net 2001-