Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Поиск пользователя в AD

Ответить
Настройки темы
PowerShell - [решено] Поиск пользователя в AD

Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить PM | Цитировать


Изменения
Автор: pogo
Дата: 23-10-2013
Доброго времени суток.

Задача написать скрипт который выключал бы учётные записи найденные по информации из .csv файла.

Файл .csv следующего содержания (поля могут добавляться, но я думаю, что этих двух полей для идентификации нужного пользователя хватит):

Name;JobTitle
Иванов Иван Иванович;бухгалтер
Петров Пётр Петрович;менеджер

Полю Name из файла в AD соответствует поле Display name

Вопрос, возможно ли по данной информации найти пользователя во всём домене, а не в конкретном OU?

Есть вот тестовый код:

Код: Выделить весь код
cls

Import-Module ActiveDirectory

$Users = Import-Csv "D:\scripts\ps\users.csv" -Delimiter ";"
#$Global:count = 0

function disableUser ($UserName, $JobTitle)
{
    Write-Host ('User: ' + $UserName)
    Write-Host ('JobTitle: ' + $Jobtitle)

    Get-ADUser $UserName | Set-ADUser -Enabled $false
    #$Global:count = $Global:count + 1
}


function main {
    foreach($User in $Users)
    {
        disableUser $User.Name $User.JobTitle
    }
}

main
#Write-Host ('count: ' + $Global:count)
Но он не работает, ошибка:
Цитата:
Get-ADUser : Не удается найти объект с удостоверением: "Иванов Иван Иванович" в "DC=test,DC=ru".
D:\scripts\ps\RemoveUsers.ps1:13 знак:5
Подскажите пожалуйста, что не так делаю?

Отправлено: 10:38, 23-10-2013

 

Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить PM | Цитировать


Цитата:
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 сессий?

Отправлено: 11:23, 28-10-2013 | #21



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Добавить в конец скрипта - Remove-PSSession $exch

Отправлено: 11:54, 28-10-2013 | #22


Старожил


Сообщения: 208
Благодарности: 5

Профиль | Отправить PM | Цитировать


Вроде допилил скрипт, может кому пригодится.
Отдельная благодарность пользователю 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

Последний раз редактировалось pogo, 29-10-2013 в 15:45.

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:56, 29-10-2013 | #23



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Поиск пользователя в AD

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - Создание пользователя AD garbals Скриптовые языки администрирования Windows 7 22-11-2013 13:12
Поиск принтеров через AD (проблема) -KeyMaster- Microsoft Windows NT/2000/2003 12 29-06-2012 11:41
PowerShell - Поиск в определенной группе конкретного пользователя ejik_off Скриптовые языки администрирования Windows 1 26-12-2011 10:15
PowerShell - [решено] Создания пользователя в AD ejik_off Скриптовые языки администрирования Windows 7 09-12-2011 07:20
Права пользователя без AD goshargh Microsoft Windows 2000/XP 6 02-08-2006 10:28




 
Переход