Для того, чтобы обеспечить безопасную работу компьютеров и серверов в инфраструктуре компании рекомендуется не выдавать администраторские права обычным пользователям, а так же регулярно менять пароли локальных учетных записей администраторов. Для этой цели я использую VB-скрипт, который регулярно запускается на компьютере, обновляет пароль и отправляет новый пароль в базу данных.
Чтобы обеспечить строгий пароль для этой задачи, я написал следующую функцию, которая генерирует пароль указанной длины из 4 составляющих: прописные буквы, заглавные буквы, цифры, специальные символы. Причем из выбора заглавных букв исключена буква "O", который можно трактовать, как цифру "0", а из специальных символов исключены скобки и подстановочные спецсимволы, которые используются в SQL запросах.
Function GeneratePassword(iPasswordLength) strPassword = "" sLowerCaseLetters = "abcdefghijkmnopqrstuvwxyz" sUpperCaseLetters = "ABCDEFGHJKLMNPQRSTUVWXYZ" sNumbers = "0123456789" sSpecialSymbols = "!@#$^&*-+=/\~" iLetters = iPasswordLength - round(iPasswordLength / 3) iOthers = iPasswordLength - iLetters iLowLetters = iLetters - round(iLetters/3) iUpLetters = iLetters - iLowLetters iNumbers = iOthers - round(iOthers/3) iSymbols = iOthers - iNumbers For i = 1 to iLowLetters Randomize iCurrentSymbol = Int(rnd()*Len(sLowerCaseLetters) + 1) strPassword = strPassword & Mid(sLowerCaseLetters, iCurrentSymbol, 1) WScript.Sleep(10) Next For i = 1 to iUpLetters Randomize iCurrentSymbol = Int(rnd()*Len(sUpperCaseLetters) + 1) strPassword = strPassword & Mid(sUpperCaseLetters, iCurrentSymbol, 1) WScript.Sleep(10) Next For i = 1 to iSymbols Randomize iCurrentSymbol = Int(rnd()*Len(sSpecialSymbols) + 1) strPassword = strPassword & Mid(sSpecialSymbols, iCurrentSymbol, 1) WScript.Sleep(10) Next For i = 1 to iNumbers Randomize iCurrentSymbol = Int(rnd()*Len(sNumbers) + 1) strPassword = strPassword & Mid(sNumbers, iCurrentSymbol, 1) WScript.Sleep(10) Next GeneratePassword = strPassword End Function
Данная функция берет за основу указанную длину пароля и 2/3 символов отводит под буквы, 2/9 - под цифры, 1/9 - под спецсимволы.
Для генерации пароля используется функция RND - псевдогенератор случайных чисел, которая выдает случайное число от 0 до 1, исключая саму единицу, но включая ноль. Чтобы получить случайное число в диапазоне от единицы до длины строки выборки символов, я умножаю сгенерированное число на длину строки, отбрасываю дробную часть и добавляю единицу. Полученное число указывает на номер символа в строке выборки.
Чтобы функция RND выдавала случайные числа, перед каждым её запуском я выполняю процедуру RANDOMIZE, которая основана на таймере компьютера, а после запуска делаю паузу в 10 миллисекунд, чтобы таймер сдвинулся на большее количество интервалов.
Примеры паролей, полученных функцией GeneratePassword(12):
yrffhTAP*169
wbmqaKAF$786
fsnfpTBQ/169
vgvhyHKR@925
erufiTHP-119
unibkPXK+978
Для своего удобства я не стал менять местами большие и маленькие буквы, спецсимволы и цифры, но если это требуется, то полученный пароль можно перемешать перед возвращением значения в тело скрипта, чтобы усилить его.