Войти

Показать полную графическую версию : скрипт отключения пользователей из Exel в AD через PS


Страниц : [1] 2

yuriy.nepomnyashchiy.3@fb
02-02-2015, 17:27
Добрый день, коллеги!

облазил весь интернет, и везде приводятся разные примеры отключения пользователей списком и все то не работают, то со своими параметрами не очень понятными мне.

собственно суть проста, что нужно.

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
2. уже смирился, что из самого экселя никто не даёт примера, чтоб отключить список пользователей именно из эксель файла, без перевода в CSV. »
Да ну. На MS за глаза хватало примеров.

yuriy.nepomnyashchiy.3@fb
02-02-2015, 17:36
Iska, ну не знаю как там за глаза, но то что мне нужно я вот не нашёл.

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

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

http://i.imgur.com/zwxlR4n.png

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
Iska, спасибо завтра попробую!

yuriy.nepomnyashchiy.3@fb
03-02-2015, 16:51
Iska, подскажите, в данном примере не вижу пути к файлу, с которого провести отключение?

Iska
03-02-2015, 18:32
yuriy.nepomnyashchiy.3@fb, а там нет пути. Процедура вставляется непосредственно в модуль «ЭтаКнига» той Рабочей книги, на первом листе («Лист1») которой содержится список из двух столбцов с заголовками. Я понял вопрос:
из самого экселя никто не даёт примера, чтоб отключить список пользователей именно из эксель файла »
именно так — чтобы работало непосредственно из VBA, а не из внешнего файла. Впрочем, перевести этот код во внешний скрипт WSH или PoSH тоже вполне возможно.

Kazun
04-02-2015, 15:11
$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
Kazun, это:
Get-Process EXCEL | Stop-Process -Force »
является обязательным?

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

Iska
04-02-2015, 18:43
Kazun, спасибо, ясно.

yuriy.nepomnyashchiy.3@fb
09-02-2015, 11:50
Kazun, это тоже VBA? ну т.е. макрос?

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

Iska
09-02-2015, 18:38
Kazun, это тоже VBA? ну т.е. макрос? »
Нет, это скрипт PowerShell, работающий со внешним xls-файлом.

yuriy.nepomnyashchiy.3@fb
16-02-2015, 11:17
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
Добавить: Import-Module ActiveDirectory

yuriy.nepomnyashchiy.3@fb
16-02-2015, 11:43
Kazun, не помогло(

файл эксель внутри, имена естественно вымышленные, но в рабочем файлы настоящие
http://i.imgur.com/hawD0NZ.jpg

скрипт

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
Get-ADuser-Filter"EmployeeID -eq '$EmployeeID' -and DisplayName -eq '$DisplayName'" -Почему команда написана слитно?

yuriy.nepomnyashchiy.3@fb
16-02-2015, 12:46
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
В фильтре, наличие пробелов в строках, несовпадение DisplayName и EmployeeID. Можно попробовать вручную посмотреть результат поиска для проблемных пользователей.

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

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

yuriy.nepomnyashchiy.3@fb
16-02-2015, 13:05
Kazun, проблема была в том что в поле "выводимое имя" у нас принято , если человек сменил ФИО писать его старое ФИО в скобках после ФИО - ну что-то типа "Иванова Мария Ивановна (Сидорова)" :)

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

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

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




© OSzone.net 2001-2012