Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   скрипт отключения пользователей из Exel в AD через PS (http://forum.oszone.net/showthread.php?t=294871)

yuriy.nepomnyashchiy.3@fb 02-02-2015 17:27 2465322

скрипт отключения пользователей из 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 02-02-2015 17:29 2465323

Цитата:

Цитата yuriy.nepomnyashchiy.3@fb
2. уже смирился, что из самого экселя никто не даёт примера, чтоб отключить список пользователей именно из эксель файла, без перевода в CSV. »

Да ну. На MS за глаза хватало примеров.

yuriy.nepomnyashchiy.3@fb 02-02-2015 17:36 2465328

Iska, ну не знаю как там за глаза, но то что мне нужно я вот не нашёл.

Iska 02-02-2015 18:26 2465356

yuriy.nepomnyashchiy.3@fb, вот прямо готового именно для Вашего конкретного случая с «EmployeeID» и «DisplayName» может и не быть, разумеется.

А так есть и в Script Center, и в отдельных chm-сборниках. Берём и лепим из кирпичиков нечто наподобие такого:
Скрытый текст



Код:

Option Explicit

Sub Sample()
    Const ADS_UF_ACCOUNTDISABLE = 2

    Dim objRange As Range
   
    Dim objConnection As Object
    Dim objRecordSet As Object
   
   
    For Each objRange In ThisWorkbook.Worksheets.Item("Лист1").UsedRange.Rows
        If Not objRange.Row = 1 Then
            Set objConnection = CreateObject("ADODB.Connection")
            objConnection.Open "Provider=ADsDSOObject;"
           
            With CreateObject("ADODB.Command")
                .ActiveConnection = objConnection
                .Properties("Sort on") = "cn"
               
                .CommandText = _
                    "<LDAP://dc=mydomain,dc=local>;" & _
                    "(&(objectClass=user)(objectCategory=person)(employeeID=" & objRange.Cells(1, 1).Value & ")(displayName=" & objRange.Cells(1, 2).Value & "));" & _
                    "userAccountControl,distinguishedName;" & _
                    "subtree"
           
                Set objRecordSet = .Execute
            End With
           
            With objRecordSet
                Do Until .EOF
                    Debug.Print .Fields("distinguishedName")
                   
                    With GetObject("LDAP://" & .Fields("distinguishedName"))
                        .Put "userAccountControl", .Get("userAccountControl") Or ADS_UF_ACCOUNTDISABLE
                        .SetInfo
                    End With

                    .MoveNext
                Loop
               
                .Close
            End With
           
            objConnection.Close
            Set objConnection = Nothing
        End If
    Next
End Sub


yuriy.nepomnyashchiy.3@fb 02-02-2015 18:34 2465364

Iska, спасибо завтра попробую!

yuriy.nepomnyashchiy.3@fb 03-02-2015 16:51 2465834

Iska, подскажите, в данном примере не вижу пути к файлу, с которого провести отключение?

Iska 03-02-2015 18:32 2465886

yuriy.nepomnyashchiy.3@fb, а там нет пути. Процедура вставляется непосредственно в модуль «ЭтаКнига» той Рабочей книги, на первом листе («Лист1») которой содержится список из двух столбцов с заголовками. Я понял вопрос:
Цитата:

Цитата yuriy.nepomnyashchiy.3@fb
из самого экселя никто не даёт примера, чтоб отключить список пользователей именно из эксель файла »

именно так — чтобы работало непосредственно из VBA, а не из внешнего файла. Впрочем, перевести этот код во внешний скрипт WSH или PoSH тоже вполне возможно.

Kazun 04-02-2015 15:11 2466267

Код:

$file = "С:\users.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 Yellow
        Write-Host ('DisplayName: ' + $DisplayName) -ForegroundColor Yellow
       
        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


Iska 04-02-2015 16:09 2466296

Kazun, это:
Цитата:

Цитата Kazun
Get-Process EXCEL | Stop-Process -Force »

является обязательным?

Kazun 04-02-2015 16:13 2466297

Думаю, нет. Но процесс EXCEL , часто остается висеть в процессах, чтобы наверняка :)

Iska 04-02-2015 18:43 2466383

Kazun, спасибо, ясно.

yuriy.nepomnyashchiy.3@fb 09-02-2015 11:50 2468803

Kazun, это тоже VBA? ну т.е. макрос?

Kazun,это тоже VBA? вроде Get-ADuser это ps команда..

Iska 09-02-2015 18:38 2469118

Цитата:

Цитата yuriy.nepomnyashchiy.3@fb
Kazun, это тоже VBA? ну т.е. макрос? »

Нет, это скрипт PowerShell, работающий со внешним xls-файлом.

yuriy.nepomnyashchiy.3@fb 16-02-2015 11:17 2471852

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

Kazun 16-02-2015 11:25 2471861

Добавить: Import-Module ActiveDirectory

yuriy.nepomnyashchiy.3@fb 16-02-2015 11:43 2471871

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

Kazun 16-02-2015 11:46 2471874

Get-ADuser-Filter"EmployeeID -eq '$EmployeeID' -and DisplayName -eq '$DisplayName'" -Почему команда написана слитно?

yuriy.nepomnyashchiy.3@fb 16-02-2015 12:46 2471918

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

в чём может быть дело?

Kazun 16-02-2015 12:51 2471922

В фильтре, наличие пробелов в строках, несовпадение DisplayName и EmployeeID. Можно попробовать вручную посмотреть результат поиска для проблемных пользователей.

Можно осуществлять поиск, только по EmployeeID:

Get-ADuser -Filter "EmployeeID -eq '$EmployeeID'"

yuriy.nepomnyashchiy.3@fb 16-02-2015 13:05 2471933

Kazun, проблема была в том что в поле "выводимое имя" у нас принято , если человек сменил ФИО писать его старое ФИО в скобках после ФИО - ну что-то типа "Иванова Мария Ивановна (Сидорова)" :)

искать только по EmployeeID нет смысла т.к. часто бывают ошибки от отдела кадров) хотя тоже надо взять на заметку.

ещё один момент если, Вы знаете..

как в отключаемых пользователях применять к ним , т.е. к их почтовым ящикам отправку и получение сообщения в 1кб? ну чтоб письма отправляемые им не увеличивали их п\я в рамках этого скрипта

Kazun 16-02-2015 13:18 2471936

Код:

Get-ADuser -Filter "EmployeeID -eq '$EmployeeID' -or DisplayName -like '*$DisplayName*'"
Для Exchange:
Configure message delivery restrictions for a mailbox

yuriy.nepomnyashchiy.3@fb 17-02-2015 09:31 2472350

Kazun, спасибо за ссылку, но если Вы поняли что я имел в виду, через консоль я могу установить ограничения на доставку и приём руками, а как это реализовать скриптовой командой?

я хочу отключить пользователя потом граничить ему сообщения в размере один килобайт.

в указанной ссылке общие понятия как это сделать на консоли.

и да exchange 2010 :)

Kazun 17-02-2015 09:38 2472354

Что вызывает сложность щелкнуть раз, на ссылку ниже - Configure storage quotas for a mailbox
Configure message size limits for a mailbox

yuriy.nepomnyashchiy.3@fb 17-02-2015 10:14 2472367

Kazun, спасибо! просто не увидел, я прочту и думаю у меня буду вопросы, я ещё не спец в PS , обычно в таких примерах указываются общие положения, но как их сцепить со своим скриптом врятли напишут) если Вы не против я ещё обращусь к Вам)

Kazun 17-02-2015 10:42 2472382

Запускать скрипт в шелле EMS,немного изменив:

Код:

Get-ADuser -Filter "EmployeeID -eq '$EmployeeID' -or DisplayName -like '*$DisplayName*'" | Disable-ADAccount -Confirm:$false -PassThru | Foreach {
        Set-Mailbox -Identity $_.UserPrincipalName -MaxSendSize 1kb -MaxReceiveSize 1kb
}


yuriy.nepomnyashchiy.3@fb 17-02-2015 17:27 2472530

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
ПРЕДУПРЕЖДЕНИЕ: Команда выполнена успешно, но параметры 'ххх.ххх.хх/хх/хх/Петрова Наталия Андреевна' не были изменены.




отключает их нормально.
но меняет размер сообщений только у Петрова Наталия Андреевна , а в файле она последняя в списке из этих двух человек и плюс ещё

"Команда выполнена успешно, но параметры 'ххх.ххх.хх/хх/хх/Петрова Наталия Андреевна' не были изменены."

что не так :(

Kazun 18-02-2015 12:43 2472852

Вместо этого кода:
Код:

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 {
        Set-Mailbox -Identity $_.UserPrincipalName -MaxSendSize 1kb -MaxReceiveSize 1kb
}


Yuriy_nepo 13-05-2015 11:30 2506811

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
}

Kazun 13-05-2015 11:33 2506812

Код:

Get-ADuser -Filter "EmployeeID -eq '$EmployeeID' -or DisplayName -like '*$DisplayName*'" | Disable-ADAccount -Confirm:$false -PassThru | Foreach {
        Set-ADuser $_ -Description "Комментарий"
        Set-Mailbox -Identity $_.UserPrincipalName -MaxSendSize 1kb -MaxReceiveSize 1kb -HiddenFromAddressListsEnabled $True
}


Yuriy_nepo 13-05-2015 11:45 2506819

объясните доходчиво, что значит "$_" и вообще не очень понимаю значение знака $, если есть время

Kazun 13-05-2015 12:00 2506824

$_ (доллар и нижнее подчеркивание) — применяется для передачи значения при использовании конвейера. Специальная переменная $_ принимает текущее значение каждого объекта, переданного по конвейеру. Например следующая команда просто выводит по очереди все значения:

′one′, ′two′, ′three′ | foreach {Write-Host $_}


apelsinchik 12-07-2017 17:25 2750940

Привет друзья.
Нужен такой же скрипт, только имеется дополнительная колонка со статусом пользователя. (Account Status)
Нужно так... Когда пользователь находится в статусе Disabled - то отключить его в АД
Если пользователь Enabled - то не трогать его.
Нужно как бы фильтровать
Спасибо


Время: 19:04.

Время: 19:04.
© OSzone.net 2001-