Дано:
Терминальный сервер Windows без домена. Пользователи зарегистрированы на самом сервере.
Задача: сменить всем пароли.
Решение
Длина пароля составляет 14 символов.
1) Создаем файл ChangeUserPass.os
// Запускать от имени администратора.
Функция НовыйПароль(КоличествоСимволов = 14)
ГЦ = Новый ГенераторСлучайныхЧисел;
НижняяГраницаЧисел = 1;
ВерхняяГраницаЧисел = 9;
СтрЧисла = "0123456789";
СтрБуквыЗаглавные = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
СтрБуквыСтрочные = "abcdefghijkmnopqrstuvwxyz";
СтрСпецСимволы = "!@#$%^&*()-";
СтрНабор = "Aa!Bb@Cc#Dd$Ee%^Ff&Gg*Hh(Ii)Jj-Kk1L2Mm3Nn4Oo5Pp6Qq7Rr8Ss9Tt2Uu4Vv5Ww6Xx7Yy8Zz9";
Пароль = "";
СлучЧисл = ГЦ.СлучайноеЧисло(1, СтрДлина(СтрЧисла));
СлучайныйСимвол = Сред(СтрЧисла, СлучЧисл, 1);
Пароль = Пароль + СлучайныйСимвол;
СлучЧисл = ГЦ.СлучайноеЧисло(1, СтрДлина(СтрБуквыЗаглавные));
СлучайныйСимвол = Сред(СтрБуквыЗаглавные, СлучЧисл, 1);
Пароль = Пароль + СлучайныйСимвол;
СлучЧисл = ГЦ.СлучайноеЧисло(1, СтрДлина(СтрБуквыСтрочные));
СлучайныйСимвол = Сред(СтрБуквыСтрочные, СлучЧисл, 1);
Пароль = Пароль + СлучайныйСимвол;
СлучЧисл = ГЦ.СлучайноеЧисло(1, СтрДлина(СтрСпецСимволы));
СлучайныйСимвол = Сред(СтрСпецСимволы, СлучЧисл, 1);
Пароль = Пароль + СлучайныйСимвол;
СлучЧисл = ГЦ.СлучайноеЧисло(1, СтрДлина(СтрНабор));
СлучайныйСимвол = Сред(СтрНабор, СлучЧисл, 1);
Пароль = Пароль + СлучайныйСимвол;
СлучЧисл = ГЦ.СлучайноеЧисло(1, СтрДлина(СтрНабор));
СлучайныйСимвол = Сред(СтрНабор, СлучЧисл, 1);
Пароль = Пароль + СлучайныйСимвол;
ДополнительноеКоличество = КоличествоСимволов - 6 - 1;
Для ч = 0 По ДополнительноеКоличество Цикл
СлучЧисл = ГЦ.СлучайноеЧисло(1, СтрДлина(СтрНабор));
СлучайныйСимвол = Сред(СтрНабор, СлучЧисл, 1);
Пароль = Пароль + СлучайныйСимвол;
КонецЦикла;
Возврат Пароль;
КонецФункции
Функция ЗаменитьСимволы(т)
Стр = "АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЬьЫыЪъЭэЮюЯя";
// В обратную сторону, т.е. в первую очередь замена существующих русских букв.
т = СтрЗаменить(т, "п", "я");
т = СтрЗаменить(т, "о", "ю");
т = СтрЗаменить(т, "н", "э");
т = СтрЗаменить(т, "к", "ъ");
т = СтрЗаменить(т, "л", "ы");
т = СтрЗаменить(т, "м", "ь");
т = СтрЗаменить(т, "й", "щ");
т = СтрЗаменить(т, "и", "ш");
т = СтрЗаменить(т, "з", "ч");
т = СтрЗаменить(т, "ж", "ц");
т = СтрЗаменить(т, "е", "х");
т = СтрЗаменить(т, "д", "ф");
т = СтрЗаменить(т, "г", "у");
т = СтрЗаменить(т, "в", "т");
т = СтрЗаменить(т, "б", "с");
т = СтрЗаменить(т, "а", "р");
// Теперь остальные.
т = СтрЗаменить(т, "Ђ", "А");
т = СтрЗаменить(т, " ", "а");
т = СтрЗаменить(т, "Ѓ", "Б");
т = СтрЗаменить(т, "Ў", "б");
т = СтрЗаменить(т, "‚", "В");
т = СтрЗаменить(т, "ў", "в");
т = СтрЗаменить(т, "ѓ", "Г");
т = СтрЗаменить(т, "Ј", "г");
т = СтрЗаменить(т, "„", "Д");
т = СтрЗаменить(т, "¤", "д");
т = СтрЗаменить(т, "…", "Е");
т = СтрЗаменить(т, "Ґ", "е");
//т = СтрЗаменить(т, "р", "Ё"); // Почему-то Ё закодировалась как р. Есть пересечение замены а->р.
//т = СтрЗаменить(т, "с", "ё"); // Почему-то ё закодировалась как с. Есть пересечение замены б->с.
т = СтрЗаменить(т, "†", "Ж");
т = СтрЗаменить(т, "¦", "ж");
т = СтрЗаменить(т, "‡", "З");
т = СтрЗаменить(т, "§", "з");
т = СтрЗаменить(т, "€", "И");
т = СтрЗаменить(т, "Ё", "и");
т = СтрЗаменить(т, "‰", "Й");
т = СтрЗаменить(т, "©", "й");
т = СтрЗаменить(т, "Љ", "К");
т = СтрЗаменить(т, "Є", "к");
т = СтрЗаменить(т, "‹", "Л");
т = СтрЗаменить(т, "«", "л");
т = СтрЗаменить(т, "Њ", "М");
т = СтрЗаменить(т, "¬", "м");
т = СтрЗаменить(т, "Ќ", "Н");
т = СтрЗаменить(т, "", "н");
т = СтрЗаменить(т, "Ћ", "О");
т = СтрЗаменить(т, "®", "о");
т = СтрЗаменить(т, "Џ", "П");
т = СтрЗаменить(т, "Ї", "п");
т = СтрЗаменить(т, "ђ", "Р");
//т = СтрЗаменить(т, "а", "р"); // Почему-то р закодировалась как а.
т = СтрЗаменить(т, "‘", "С");
//т = СтрЗаменить(т, "б", "с"); // Почему-то с закодировалась как б.
т = СтрЗаменить(т, "’", "Т");
//т = СтрЗаменить(т, "в", "т"); // Почему-то т закодировалась как в.
т = СтрЗаменить(т, "“", "У");
//т = СтрЗаменить(т, "г", "у"); // Почему-то у закодировалась как г.
т = СтрЗаменить(т, "”", "Ф");
//т = СтрЗаменить(т, "д", "ф"); // Почему-то ф закодировалась как д.
т = СтрЗаменить(т, "•", "Х");
//т = СтрЗаменить(т, "е", "х"); // Почему-то х закодировалась как е.
т = СтрЗаменить(т, "–", "Ц");
//т = СтрЗаменить(т, "ж", "ц"); // Почему-то ц закодировалась как ж.
т = СтрЗаменить(т, "—", "Ч");
//т = СтрЗаменить(т, "з", "ч"); // Почему-то ч закодировалась как з.
т = СтрЗаменить(т, "", "Ш");
//т = СтрЗаменить(т, "и", "ш"); // Почему-то ш закодировалась как и.
т = СтрЗаменить(т, "™", "Щ");
//т = СтрЗаменить(т, "й", "щ"); // Почему-то щ закодировалась как Й.
т = СтрЗаменить(т, "њ", "Ь");
//т = СтрЗаменить(т, "м", "ь"); // Почему-то ь закодировалась как м.
т = СтрЗаменить(т, "›", "Ы");
//т = СтрЗаменить(т, "л", "ы"); // Почему-то ы закодировалась как л.
т = СтрЗаменить(т, "љ", "Ъ");
//т = СтрЗаменить(т, "к", "ъ"); // Почему-то ъ закодировалась как к.
т = СтрЗаменить(т, "ќ", "Э");
//т = СтрЗаменить(т, "н", "э"); // Почему-то э закодировалась как н.
т = СтрЗаменить(т, "ћ", "Ю");
//т = СтрЗаменить(т, "о", "ю"); // Почему-то ю закодировалась как о.
т = СтрЗаменить(т, "џ", "Я");
//т = СтрЗаменить(т, "п", "я"); // Почему-то я закодировалась как п.
Возврат т;
КонецФункции
Попытка
КоличествоСимволов = 14;
ТекДата = ТекущаяДата();
сТекДата = Строка(ТекДата);
сТекДата = СтрЗаменить(сТекДата, Символы.НПП, "");
сТекДата = СтрЗаменить(сТекДата, ":", ".");
сТекДата = СтрЗаменить(сТекДата, " ", "_");
чДень = День(ТекДата);
чГод = Год(ТекДата);
чМес = Месяц(ТекДата);
сГод = СтрЗаменить(Строка(чГод), Символы.НПП, "");
сМес = ?(чМес > 9, Строка(чМес), "0"+Строка(чМес));
сДень = ?(чДень > 9, Строка(чДень), "0"+Строка(чДень));
КаталогЛогов = "C:\Temp\";
ИмяЛога = КаталогЛогов + "LogUserPass_" + сТекДата + ".txt";
ЛогУд = Новый ЗаписьТекста(ИмяЛога, КодировкаТекста.UTF8);
ИмяФСписПольз = КаталогЛогов + "Users_" + сТекДата + ".txt";
ИмяФСписПольз = КаталогЛогов + "Users.txt";
тСообщ = "ИмяФСписПольз=" + ИмяФСписПольз;
ЛогУд.ЗаписатьСтроку(тСообщ);
Сообщить(ИмяФСписПольз);
//кмдСписПольз = "CMD.exe /C chcp 65001 & net user>"+ИмяФСписПольз;
кмдСписПольз = "CMD.exe /C net user>"+ИмяФСписПольз;
тСообщ = "кмдСписПольз=" + кмдСписПольз;
Сообщить(кмдСписПольз);
ЛогУд.ЗаписатьСтроку(тСообщ);
ШаблонСменыПароля = "CMD.exe /C net user [user] [pass]";
КодВозврата = 0;
ЗапуститьПриложение(кмдСписПольз, КаталогЛогов, Истина, КодВозврата);
тСообщ = "КодВозврата=" + Строка(КодВозврата);
Сообщить(тСообщ);
ЛогУд.ЗаписатьСтроку(тСообщ);
Ф = Новый Файл(ИмяФСписПольз);
Если НЕ Ф.Существует() Тогда
тСообщ = "Отсутствует файл: " + ИмяФСписПольз;
Сообщить(тСообщ);
ЛогУд.ЗаписатьСтроку(тСообщ);
ЗавершитьРаботу(0);
ЛогУд.Закрыть();
КонецЕсли;
//ЧТ = Новый ЧтениеТекста(ИмяФСписПольз, "windows-1251");
ЧТ = Новый ЧтениеТекста(ИмяФСписПольз, "cp866");
ВесьТекст = ЧТ.Прочитать();
ЧТ.Закрыть();
Сообщить(ВесьТекст);
МасПС = СтрРазделить(ВесьТекст, Символы.ПС);
КолМасПС = МасПС.Количество();
Сообщить("КолМасПС=" + Строка(КолМасПС));
МассивЛогинов = Новый Массив;
Для Каждого ТекСтр ИЗ МасПС Цикл
Если ПустаяСтрока(ТекСтр) Тогда Продолжить; КонецЕсли;
Если Найти(ТекСтр, "--") > 0 Тогда Продолжить; КонецЕсли;
Если Найти(ТекСтр, "\\") > 0 Тогда Продолжить; КонецЕсли;
//ТекСтр = ЗаменитьСимволы(ТекСтр);
Если Найти(ВРЕГ(ТекСтр), ВРЕГ("Команда")) > 0 И Найти(ВРЕГ(ТекСтр), ВРЕГ("выполнена")) > 0 Тогда Продолжить; КонецЕсли;
Если ПустаяСтрока(ТекСтр) Тогда
Продолжить;
КонецЕсли;
ЛогУд.ЗаписатьСтроку(ТекСтр);
Мас1 = СтрРазделить(ТекСтр, " ");
КолСтрМас = Мас1.Количество();
//Сообщить("КолСтрМас=" + Строка(КолСтрМас));
МаксИнд = КолСтрМас - 1;
Логин = "";
// + Для обработки логинов, содержащих пробел, например "Иванов Иван". Ограничение: только один пробел между словами логина.
Для ч = 0 ПО МаксИнд Цикл
ТекЭл = Мас1[ч];
//Сообщить("ТекЭл=" + ТекЭл);
Если ПустаяСтрока(ТекЭл) Тогда
Если НЕ ПустаяСтрока(Логин) Тогда
МассивЛогинов.Добавить(Логин);
Логин = "";
КонецЕсли;
Продолжить;
КонецЕсли;
Логин = ?(ПустаяСтрока(Логин), ТекЭл, Логин + " " + ТекЭл);
КонецЦикла;
// - Для обработки логинов, содержащих пробел, например "Иванов Иван". Ограничение: только один пробел между словами логина.
КонецЦикла;
н = -1;
Для Каждого Логин ИЗ МассивЛогинов Цикл
н = н + 1;
тСообщ = "МассивЛогинов[" + Строка(н) + "]=" + Логин;
Сообщить(тСообщ);
Если ВРЕГ(Логин) = ВРЕГ("admin1") Тогда
Продолжить; // Если сменить пароли абсолютно всем и не знать паролей, то не получится войти. Поэтому один-два админа сменят сами свои пароли.
КонецЕсли;
кмд = СтрЗаменить(ШаблонСменыПароля, "[user]", """" + Логин + """");
Пароль = НовыйПароль(КоличествоСимволов);
кмд = СтрЗаменить(кмд, "[pass]", """" + Пароль + """");
ЛогУд.ЗаписатьСтроку(кмд);
ЗапуститьПриложение(кмд, КаталогЛогов, Истина, КодВозврата);
тСообщ = "КодВозврата=" + Строка(КодВозврата);
Сообщить(тСообщ);
ЛогУд.ЗаписатьСтроку(тСообщ);
КонецЦикла;
ЛогУд.Закрыть();
Исключение
тСообщ = Строка(ТекущаяДата()) + ": " + ОписаниеОшибки();
Сообщить(тСообщ);
ЛогУд.ЗаписатьСтроку(тСообщ);
ЛогУд.Закрыть();
КонецПопытки;
2) Создаем файл ChangeUserPass.bat
net user>C:\Temp\Users.txt
C:\utils\OneScript\bin\oscript.exe C:\utils\os\ChangeUserPass.os
3) Проверяем, что каталоги для создания файлов совпадают; в моем случае «C:\Temp\».
4) Запускаем ChangeUserPass.bat
Если не создались файлы, пробуем запустить от имени администратора.
5) В каталоге «C:\Temp\» должен быть файл «LogUserPass_*.txt» со списком логинов и паролей.
6) Все пароли сменены. Задача решена.