PDA

Показать полную графическую версию : [решено] Поиск пользователя в AD


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

pogo
28-10-2013, 11:23
New-PSSession : [exchange] Сбой подключения к удаленному серверу exchange. Сообщение об ошибке: The WS-Management service cannot process the request. This user is allowed a maximum number of 18 concurrent shells, which has been exceeded. Close existing shells or raise
the quota for this user. Подробности см. в разделе справки "about_Remote_Troubleshooting".
D:\scripts\ps\RemoveUsers.ps1:14 знак:9
+ $exch = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http: ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotingTransportE
xception
+ FullyQualifiedErrorId : -2144108123,PSSessionOpenFailed
Import-PSSession : Не удается проверить аргумент для параметра "Session". Аргумент имеет значение NULL. Укажите аргумент, не имеющий значение NULL, после чего повторите выполнение команды.
D:\scripts\ps\RemoveUsers.ps1:15 знак:18
+ Import-PSSession $exch -CommandName Get-Mailbox,Set-Mailbox -AllowClobber
+ ~~~~~
+ CategoryInfo : InvalidData: (:) [Import-PSSession], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.ImportPSSessionCommand

ПРЕДУПРЕЖДЕНИЕ: Команда выполнена успешно, но параметры 'test.ru/Test/Иванов Иван Иванович' не были изменены.
ПРЕДУПРЕЖДЕНИЕ: Команда выполнена успешно, но параметры 'test.ru/Test/Петров Пётр Петрович' не были изменены.

Как я понимаю, запуская скрипт, сессии то я открывал, но они почему то не закрывались.
Это лечится каким-нибудь $exch.close или всё глобальнее?
И как я могу закрыть уже открытые 18 сессий?

Kazun
28-10-2013, 11:54
Добавить в конец скрипта - Remove-PSSession $exch

pogo
29-10-2013, 09:56
Вроде допилил скрипт, может кому пригодится.
Отдельная благодарность пользователю Kazun за помощь в написании скрипта.
Действия скрипта написаны в его описании, формат файла .csv следующий:


Name;JobTitle
Иванов Иван Иванович;Мерчендайзер
Петров Петр Петрович;Региональный менеджер
Сидоров Сидор Сидорович;пилот
#######################################################################################
#
# Скрипт автоматического выключения учётных записей, удаления всех групп в которых
# состоит учётная запись, переноса в OU для отключенных учётных записей и скрытия
# учётной записи из общей адресной книги MS Exchange
#
#######################################################################################

cls

#Импортируем модуль для работы с AD удалённо
Import-Module ActiveDirectory

#Импортируем командлеты Exchange
$exch = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://exchange/powershell
Import-PSSession $exch -CommandName Get-Mailbox,Set-Mailbox -AllowClobber

$programmName = "RemoveUsers"
#Импортируем информацию о пользователях из файла в переменную
$users = Import-Csv "D:\scripts\ps\users.csv" -Delimiter ";"
#Преобразуем дату в нужный формат
$date = Get-Date -Format "yyyy-MM-dd"
#Путь OU для выключенных аккаунтов
$pathOU = "OU=Disable Users,DC=domain,DC=ru"
#Директория куда пишется логи
$logFile = "D:\scripts\ps\" + $date + "_" + $programmName + ".log"

#Функция записи логов в файл
function writeLog ($type, $msg) {
#Преобразуем дату и время в нужный формат
$date = Get-Date -Format "dd.MM.yyyy HH:mm:ss"
$msg = $date + "`t" + $type + "`t" + $msg
#Записываем сообщение в файл
Out-File -FilePath $logFile -InputObject $msg -Append -encoding unicode
}

#Функция получения логина пользователя
function getLogin ($userName, $jobTitle) {
try {
#Если пользователь с указанным именем и должность есть в AD, записываем его логин в переменную и возвращаем её
$login = (Get-ADUser -Filter {DisplayName -eq $userName -and Title -eq $jobTitle}).SamAccountName
if ($login -ne $null) {
$type = "OK `t getLogin `t"
$msg = "Логин $userName - $login"
writeLog $type $msg
return $login
}
else {
$type = "Info `t getLogin `t"
#$msg = "Пользователь $userName в должности $jobTitle не найден"
$msg = "$_"
writeLog $type $msg
}
}
catch {
$type = "Error `t getLogin `t"
#$msg = "Пользователь $userName в должности $jobTitle не найден"
$msg = "$_"
writeLog $type $msg
break
}
}

#Функция получения объекта ADUser
function getAccount ($userName, $jobTitle) {
try {
#Если пользователь с указанным именем и должность есть в AD, записываем его в переменную и возвращаем её
$account = Get-ADUser -Filter {DisplayName -eq $userName -and Title -eq $jobTitle}
return $account
}
catch {
$type = "Error `t getAccount `t"
$msg = "$_"
writeLog $type $msg
break
}
}

#Функция выключения учётной записи
function disableUser ($login) {
try {
Set-ADUser $login -Enabled $false
$type = "OK `t disableUser `t"
$msg = "Учётная запись пользователя $login отключена"
writeLog $type $msg
}
catch {
$type = "Error `t disableUser `t"
$msg = "$_"
writeLog $type $msg
break
}
}

#Функция удаления пользователя их всех групп в которых он состоит
function removeGroupsOfMember ($login) {
try {
$groupsOfMember = Get-ADUser -Filter {SamAccountName -eq $login} -Properties MemberOf
#Если переменная существует
if ($groupsOfMember) {
foreach ($group in $groupsOfMember.memberof) {
#Удаляем группы
Remove-ADGroupMember -Identity $group -Members $groupsOfMember -Confirm:$false
$type = "OK `t removeGroupsOfMember"
$msg = "Учётная запись пользователя $login удалена из групп(ы): $group"
writeLog $type $msg
}
}
else {
$type = "Info `t removeGroupsOfMember"
#$msg = "Групп не найдено"
$msg = "$_"
writeLog $type $msg
}
}
catch {
$msg = "$_"
$type = "Error `t removeGroupsOfMember"
writeLog $type $msg
break
}
}

#Функция переноса учётной записи
function moveToOU($user, $pathOU) {
try {
#Переносим учётную запись пользователя в OU указанный в pathOU
Move-ADObject $user -TargetPath $pathOU
$msg = "Учётная запись $login перенесена в $pathOU"
$type = "OK `t moveToOU `t"
writeLog $type $msg
}
catch {
$msg = "$_"
#$msg = "Учётная запись $login не перенесена"
$type = "Error `t moveToOU `t"
writeLog $type $msg
break
}
}

#Функция скрывает e-mail адрес пользователя из общей адресной книги
function hiddenAddressList ($login) {
try {
#Скрываем e-mail адрес из общей адресной книги
Set-Mailbox -HiddenFromAddressListsEnabled $true -Identity $login
$type = "OK `t hiddenAddressList"
$msg = "Почтовый ящик пользователя $login удалён из адресной книги"
writeLog $type $msg
}
catch {
$type = "Error `t hiddenAddressList"
#$msg = "Почтовый ящик пользователя $login не удалён из адресной книги"
$msg = "$_"
writeLog $type $msg
break
}
}

#Главная функция
function main {
try {
foreach($user in $users) {
$login = getLogin $user.Name $user.JobTitle
$account = getAccount $user.Name $user.JobTitle
disableUser $login
removeGroupsOfMember $login
moveToOU $account $pathOU
hiddenAddressList $login
}
$type = "OK `t main `t`t"
$msg = "$_"
#$msg = "Скрипт выполнился успешно"
writeLog $type $msg
#закрываем сессию с exchange
Remove-PSSession $exch
}
catch {
$type = "Error `t main `t`t"
$msg = "$_"
writeLog $type $msg
break
}
}

main




© OSzone.net 2001-2012