Ищем уволенных сотрудников в Active Directory через SQL базу
29 Апрель 2009
У меня в организации есть база данных в которой отображается вся миграция сотрудников внутри вуза. Из этой базы мы когда заводим сотруднику учетную запись в Active Directory в поле WebPage заносим ID пользователя. Так, что вот, родился скрипт чтоб вычистить всех уволенных пользователей. Пока он просто на консоль выводит информацию, чтоб инженер мог вручную все просмотреть и принять решение, но его легко можно модифицировать чтоб он сам блокировал/удалял учетную запись пользователя.
param ([switch]$show, [switch]$disable, [switch]$csv)
#########################################################################################
# Created: Zakharchenko Andrey Ruslanovich
# Date: 2009.04.29
# Description: Поиск уволенных пользователей в Active Directory через запрос в
# к MS SQL серверу
# Dependencies: Quest.ActiveRoles.ADManagement
#########################################################################################
$SQLServer = "SQLSERVER"
$DBName = "DB_SOTRUDNIC"
$i = 0
$text = "`n
`t Надо использовать следующий синтаксис скрипта:
`t -show - Выводит информацию на консоль
`t -disable - Отключает всех уволенных сотрудников
`t -csv - Выводит информацию в формате для csv
`t------------------------------------------------------------------------------------
`t Пример:
`t ./search-delete-user-from-ad.ps1 -show "
if (!($show) -and !($disable) -and !($csv)) {write-warning $text; return}
$SQLConnection = new-object System.Data.SqlClient.SqlConnection("Initial Catalog=$DBName;Data Source=$SQLServer; `
Integrated Security=SSPI")
$SQLConnection.Open()
ForEach ($user in Get-QADUser -searchroot "OU=БГУЭП,DC=isea,DC=ru" -IncludedProperties WebPage,LastLogon,ParentContainer, `
whenchanged,LogonName,AccountIsDisabled -SizeLimit 0 ) {
if ($user.webpage){
if (!($user.webpage -match "^Q")) {
$query = "SELECT TOP (1) регном FROM dbo.Customer WHERE регном = " + $user.WebPage + ""
$SQLCommand = New-Object System.Data.SqlClient.SqlCommand($query, $SQLConnection)
$SQLReader = $SQLCommand.ExecuteScalar()
if (!$SQLReader) {
if ($show) {
Write-Output "Name: $($user.DisplayName)"
Write-Output "LogonName: $($user.LogonName)"
Write-Output "WebPage: $($user.WebPage)"
Write-Output "AccountIsDisabled: $($user.AccountIsDisabled)"
Write-Output "ParentContainer: $($user.ParentContainer)"
Write-Output "Whenchanged: $($user.whenchanged)"
Write-Output "LastLogon: $($user.LastLogon)"
Write-Output "-----------------------------------------------------------------------"
}
if ($disable) {
If ($user.AccountIsDisabled -eq $false) {
($user).AccountIsDisabled = $true
($user).CommitChanges()
Write-Output "Name: $($user.DisplayName) - Отключен"
Write-Output "AccountIsDisabled: $($user.AccountIsDisabled)"
}
}
if ($csv) {
$tmp = "" |Select-Object @{name='Name';expression={$($user.DisplayName)}},@{name='LogonName';expression={$($user.LogonName)}}, `
@{name='WebPage';expression={$($user.WebPage)}},@{name='AccountIsDisabled';expression={$($user.AccountIsDisabled)}}, `
@{name='ParentContainer';expression={$($user.ParentContainer)}},@{name='Whenchanged';expression={$($user.whenchanged)}}, `
@{name='LastLogon';expression={$($user.LastLogon)}}
Write-Output $tmp
}
$i++
}
}
}
}
Write-Output "Итого пользователей: $($i)"
# Out-file -filepath "Пользователи к удалению.txt" -Encoding "Unicode"
$SQLConnection.Close()
#########################################################################################
# Created: Zakharchenko Andrey Ruslanovich
# Date: 2009.04.29
# Description: Поиск уволенных пользователей в Active Directory через запрос в
# к MS SQL серверу
# Dependencies: Quest.ActiveRoles.ADManagement
#########################################################################################
$SQLServer = "SQLSERVER"
$DBName = "DB_SOTRUDNIC"
$i = 0
$text = "`n
`t Надо использовать следующий синтаксис скрипта:
`t -show - Выводит информацию на консоль
`t -disable - Отключает всех уволенных сотрудников
`t -csv - Выводит информацию в формате для csv
`t------------------------------------------------------------------------------------
`t Пример:
`t ./search-delete-user-from-ad.ps1 -show "
if (!($show) -and !($disable) -and !($csv)) {write-warning $text; return}
$SQLConnection = new-object System.Data.SqlClient.SqlConnection("Initial Catalog=$DBName;Data Source=$SQLServer; `
Integrated Security=SSPI")
$SQLConnection.Open()
ForEach ($user in Get-QADUser -searchroot "OU=БГУЭП,DC=isea,DC=ru" -IncludedProperties WebPage,LastLogon,ParentContainer, `
whenchanged,LogonName,AccountIsDisabled -SizeLimit 0 ) {
if ($user.webpage){
if (!($user.webpage -match "^Q")) {
$query = "SELECT TOP (1) регном FROM dbo.Customer WHERE регном = " + $user.WebPage + ""
$SQLCommand = New-Object System.Data.SqlClient.SqlCommand($query, $SQLConnection)
$SQLReader = $SQLCommand.ExecuteScalar()
if (!$SQLReader) {
if ($show) {
Write-Output "Name: $($user.DisplayName)"
Write-Output "LogonName: $($user.LogonName)"
Write-Output "WebPage: $($user.WebPage)"
Write-Output "AccountIsDisabled: $($user.AccountIsDisabled)"
Write-Output "ParentContainer: $($user.ParentContainer)"
Write-Output "Whenchanged: $($user.whenchanged)"
Write-Output "LastLogon: $($user.LastLogon)"
Write-Output "-----------------------------------------------------------------------"
}
if ($disable) {
If ($user.AccountIsDisabled -eq $false) {
($user).AccountIsDisabled = $true
($user).CommitChanges()
Write-Output "Name: $($user.DisplayName) - Отключен"
Write-Output "AccountIsDisabled: $($user.AccountIsDisabled)"
}
}
if ($csv) {
$tmp = "" |Select-Object @{name='Name';expression={$($user.DisplayName)}},@{name='LogonName';expression={$($user.LogonName)}}, `
@{name='WebPage';expression={$($user.WebPage)}},@{name='AccountIsDisabled';expression={$($user.AccountIsDisabled)}}, `
@{name='ParentContainer';expression={$($user.ParentContainer)}},@{name='Whenchanged';expression={$($user.whenchanged)}}, `
@{name='LastLogon';expression={$($user.LastLogon)}}
Write-Output $tmp
}
$i++
}
}
}
}
Write-Output "Итого пользователей: $($i)"
# Out-file -filepath "Пользователи к удалению.txt" -Encoding "Unicode"
$SQLConnection.Close()

.gif)
