by Admin
24. июня 2009 20:03
На днях пришлось навести порядок на нескольких старых серверах БД. Суть проблемы: в АД более 9500 учётных записей, активных не более 30% (остальные disabled).
Исторически сложилось так, что на серверах БД остались "висеть" и ряд учётных записей людей, которые покинули стены родного предприятия. В условия кризиса и не минуемой текучки персонала, скрипт написанный на PowerShell облегчит многим жизнь, в том числе и мне.
Для работы с AD я использую набор командлетов (часто называемых также AD cmdlets или QAD cmdlets), доступный с сайта http://www.quest.com/activeroles_server/arms.aspx.
$Domain = Read-Host "Введите адресс контролера"
$User = Read-Host "Введите логин"
$Password = Read-Host "Введите пароль" -AsSecureString;
#Функция очистки сервера БД от пользователей, которые в AD Disabled=TRUE
function DeleteLoginFromMSSQL ($Login)
{
#Подставляем к логину свой домен
$Login="Domain\$Login"
#Подключаемся к серверу, который чистим от учёток (в данном случае использую Windows-авторизацию)
$SQLConnection = new-object System.Data.SqlClient.SqlConnection(("Data Source='MyServerDB';Integrated Security=SSPI"))
#Сам запрос на очистку
$SQLQuery =
"DECLARE @Login sysname " +
" SET @Login='"+$Login+
#Чистим только если текущая отключенная учётка фигурирует на нашем сервере БД
"'IF EXISTS (SELECT * FROM SYS.SERVER_PRINCIPALS WHERE name=@Login) "+
"BEGIN" +
"DECLARE @str VARCHAR(255) "+
#Для более корректной очистки учёток, сперва удалим соответствующих им юзеров из всех баз
"SET @str=' "+
"USE ?; " +
"DECLARE @UserName sysname "+
"SELECT @UserName=t1.name FROM SYS.DATABASE_PRINCIPALS t1 INNER JOIN SYS.SERVER_PRINCIPALS t2 "+
"ON t1.sid=t2.sid where t2.name='''+@Login+''' "+
"IF @UserName IS NOT NULL "+
"EXECUTE sp_revokedbaccess @UserName; ' "+
#Вместо курсора по базам использую недокументированную функцию SP_MSFOREACHDB
"EXEC SP_MSFOREACHDB @str "+
#Удаляю саму учётку
"EXEC ('DROP LOGIN ['+@Login+']') " +
"END"
#Далее подключаюсь к серверу БД и выполняю запрос
$SQLConnection.Open()
$SQLCommand = New-Object System.Data.SqlClient.SqlCommand($SQLQuery, $SQLConnection)
$SQLCommand.ExecuteNonQuery()
$SQLConnection.Close()
}
#Подключаемся к АД
Connect-QADService -Service $Domain -ConnectionAccount $User -ConnectionPassword $Password;
#Пробегаем по всем отключенным пользователям из АД и вызываем функцию созданную выше
Get-QADUser -Disabled | foreach {DeleteLoginFromMSSQL $_.LogonName}
#Отключение от АД
Disconnect-QADService;