Смена паролей всем локальным пользователям Windows с помощью OneScript

27.08.20

Разработка - OneScript

Скрипт, который меняет пароли всем локальным пользователям Windows и сохраняет их в файле. Есть функция генерации пароля, можно задать длину пароля.

Дано:

Терминальный сервер 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) Все пароли сменены. Задача решена.

 

Вступайте в нашу телеграмм-группу Инфостарт

пароль смена пароля сменить Windows массовая все пароли скрипт автосмена автоматическая автоматически сбросить OneScript cmd bat безопасность паролей генерация генератор

См. также

Пароли Инструменты администратора БД Пользователь 1С v8.3 1С:Бухгалтерия 3.0 Россия Абонемент ($m)

В базах 1С у множества пользователей не установлен пароль для входа, так как в общих настройках не задана минимальная длина пароля для всех юзеров. Что делать?

1 стартмани

16.10.2025    281    1    cska1312    0    

1

OneScript Мессенджеры и боты Программист Бесплатно (free)

Создаём Telegram-бота для декомпиляции 1С файлов на OneScript и фреймворке Осень. Разберём архитектуру MVC для Telegram-бота. Научимся работать с фреймворком Осень: внедрение зависимостей, аннотации, логирование. Реализуем разбор бинарных файлов (EPF, ERT, CF, CFE.). Упакуем бота в Docker-контейнер

21.08.2025    2649    untru    15    

27

DevOps и автоматизация разработки OneScript Программист Бесплатно (free)

Когда в компании используется более 500 внешних обработок для 20 различных баз, процесс их параллельной разработки превращается в борьбу. Расскажем о тернистом пути от ручных скриптов к масштабируемой DevOps-системе, позволяющей централизованно управлять внешними обработками, автоматизировать сборки, интегрироваться с таск-трекером, запускать автотесты и разворачивать окружение в пару кликов.

12.08.2025    5996    untru    13    

24

Роли и права Пароли Инструменты администратора БД Системный администратор Программист 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Дополнительная обработка для работы с пользователями БСП и ИБ. Ключевые возможности: - Быстрый просмотр пользователей и главных свойств - Запуск приложения под любым пользователям базы данных - Поиск и исправления узких мест в безопасности - Групповое редактирование пользователей - Быстрое копирование прав доступа и групп от пользователя к пользователю Подходит для любой конфигурации с БСП на управляемых формах для клиент-серверных баз и файловых.

1 стартмани

07.07.2025    3215    48    FFX_Eka    5    

12

Пароли Системный администратор Программист 1С v8.3 Россия Абонемент ($m)

Программа позволяет хранить пароли в зашифрованном виде.

1 стартмани

30.06.2025    1108    3    user1802663    18    

3

Рефакторинг и качество кода Информационная безопасность Пароли Программист 1С v8.3 Россия Абонемент ($m)

Представьте ситуацию: вы пишете обработку для отправки email-уведомлений клиентам. Чтобы подключиться к серверу почты, вам нужны: логин, пароль, SMTP-адрес. Что делает большинство программистов?

1 стартмани

23.06.2025    3826    markbraer    11    

3

OneScript Программист 1С v8.3 Бесплатно (free)

В 2024 году главному инструменту DevOps в 1С исполнилось 10 лет. Расскажем о том, что представляет собой экосистема 1Script в 2024 году и почему её важно включить в свой рабочий процесс.

16.06.2025    6714    Evil Beaver    43    

58

Групповая разработка (Git, хранилище) EDT OneScript Программист 1С v8.3 Бесплатно (free)

В данной публикации рассматривается пример реализации скрипта, который автоматизирует получение ветки из GIT репозитория и обновление конфигурации, если разработка проекта ведется в EDT.

11.06.2025    4780    AlexF1    4    

9
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Perfolenta 207 18.08.20 08:11 Сейчас в теме
ваша проблема в том, что вы хотите выполнить команду, которую может выполнить только интерпретатор cmd (имеется ввиду команда > ). Просто укажите его в командной строке и все заработает...
кмдСписПольз = "CMD.exe /C net user > "+ИмяФСписПольз;

ключ /С нужен для того, что бы после выполнения команды интерпретатор завершил работу...
2. info1i 244 20.08.20 13:01 Сейчас в теме
(1) Спасибо за подсказку!
Пока сервер недоступен; при появлении возможности, обязательно проверю и отредактирую скрипт в публикации.
Perfolenta; +1 Ответить
3. Perfolenta 207 20.08.20 23:51 Сейчас в теме
(2) кстати, если в именах пользователей есть русские буквы, то вы наверняка столкнетесь с проблемой кодировок... если хотите, проверьте и этот вариант...
5. info1i 244 31.08.20 16:16 Сейчас в теме
(3) Проверил на русских буквах - да, была проблема. Не придумал ничего умнее, как заменить закодированные символы обратно, в итоге получилось, но могут быть ошибки с буквами Ё, ё.
Perfolenta; +1 Ответить
6. Perfolenta 207 01.09.20 08:40 Сейчас в теме
(5) я пробовал ваш пример на своём языке Перфолента, поэтому не могу сказать будет ли так работать на OneScript, но у меня, что бы побороть кодировку, оказалось достаточно указать кодовую страницу cp866:

ЧТ = Новый ЧтениеТекста(ИмяФСписПольз,"cp866");

прикрепляю мой файл на Перфоленте...
Прикрепленные файлы:
СменаПаролей.pfl
7. info1i 244 02.09.20 09:54 Сейчас в теме
(6) Я просто не знал, как указать правильно кодировку; оказывается "cp866" - так прочиталось корректно.
Скрипт доработал с учетом кодировки. Но функцию замены символов на всякий случай оставил.
Perfolenta; +1 Ответить
4. info1i 244 31.08.20 16:11 Сейчас в теме
(1) Проверил; да, теперь с помощью CMD.exe команда выполняется. Спасибо! Скрипт поправил.
Perfolenta; +1 Ответить
Для отправки сообщения требуется регистрация/авторизация