Чистим сервер БД от учёток отключенных в AD (PoSh)

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;

 

 

Tags: , ,

PowerShell | SQL Server

Добавить комментарий

  Country flag

biuquote
  • Комментарий
  • Предпросмотр
Loading