Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
1 / 1 / 1
Регистрация: 20.12.2011
Сообщений: 21

Как получить значение параметра локальной политики безопасности: Пароль должен отвечать требованиям сложности

23.03.2014, 10:30. Показов 5268. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Никак не могу найти подходящий способ получить значение параметра локальной политики безопасности (Политика учётных записей -> Политика паролей): "Пароль должен отвечать требованиям сложности" (Включен или Выключен).

Для пк которые в домене - нашёл способ получения через: WMI RSOP_SecuritySettingBoolean class.
Для пк которые не в домене - он не срабатывает у меня.

Также встречал способ через парсинг вывода утилиты secedit.exe: secedit /export /cfg c:\local.cfg. Но это какой-то костыль, он заметно усложняет мне проект (это крайний вариант). Может быть есть другие способы, через стандартные классы, например: DirectoryEntry или PrincipalContext.

Вообще, мне нужно два значения параметра локальной политики безопасности:
1) Минимальная длина пароля.
2) Пароль должен отвечать требованиям сложности.

Первое значение я получаю методом парсинга вывода команды net account, а вот второе значение никак не могу получить.

Итак, суть моего обращения:

Может быть кто-нибудь подскажет, как в C# получить значение локальной политики безопасности (Политика учётных записей -> Политика паролей): "Пароль должен отвечать требованиям сложности" (Включен или Выключен) для ПК, который не в домене ???

С Уважением, Павел...


Добавлено через 12 часов 42 минуты
Пока что решил свою задачу методом, предложенным здесь:
http://stackoverflow.com/quest... y-settings.


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
string tempFileSeceditOut = AppDomain.CurrentDomain.BaseDirectory + "seceditOut.txt"; // temp file
            
// secedit.exe
Process secedit = new Process(); 
secedit.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\secedit.exe");
secedit.StartInfo.Arguments = String.Format(@"/export /cfg ""{0}"" /quiet", tempFileSeceditOut);
secedit.StartInfo.UseShellExecute = false;
secedit.StartInfo.CreateNoWindow = true;
secedit.Start();
secedit.WaitForExit();
            
// Read first 8 lines of temp file
StreamReader readFile = new StreamReader(tempFileSeceditOut); 
            
List<string> fileReadLines = new List<string>(); 
            
for(int i=0; i<8; i++) 
fileReadLines.Add(readFile.ReadLine());
            
readFile.Close();
File.Delete(tempFileSeceditOut);
            
string MinimumPasswordLength = fileReadLines[5].Split('=')[1].Trim();
string PasswordComplexity = fileReadLines[6].Split('=')[1].Trim();
При этом создаётся файл (seceditOut.txt) с содержанием:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[Unicode]
Unicode=yes
[System Access]
MinimumPasswordAge = 0
MaximumPasswordAge = 42
MinimumPasswordLength = 13
PasswordComplexity = 1
PasswordHistorySize = 0
LockoutBadCount = 0
RequireLogonToChangePassword = 0
ForceLogoffWhenHourExpire = 0
NewAdministratorName = "Administrator"
NewGuestName = "Guest"
ClearTextPassword = 0
LSAAnonymousNameLookup = 0
EnableAdminAccount = 1
EnableGuestAccount = 0
[Event Audit]
AuditSystemEvents = 0
AuditLogonEvents = 0
AuditObjectAccess = 0
AuditPrivilegeUse = 0
AuditPolicyChange = 0
AuditAccountManage = 0
AuditProcessTracking = 0
AuditDSAccess = 0
AuditAccountLogon = 0
...............................................
Считываю нужные значения и удаляю файл.

Пока остановился на этом решении...

С Уважением, Павел.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.03.2014, 10:30
Ответы с готовыми решениями:

В чем отличие локальной политики безопасности от групповой политики безопасности
В чем отличие? И какая политика применяется с большим приоритетом? secpol.msc - локальная политика безопасности от gpedit.msc - групповая...

Каким требованиям должен отвечать сайт?
Каким требованиям сайт должен отвечать? (Функциональные и не функциональные требования)

Настройка локальной политики безопасности
В какой гр должен состоять чтобы можно было менять политику учетных записей в Win ser 2008r2(запускал и от имени админа)? в данный момент...

6
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.03.2014, 15:57
Лучший ответ Сообщение было отмечено Pablitto как решение

Решение

Pablitto, не уверен, что способ лучше есть, это же кишки винды, там всегда треш творится.

Единственное, что можно слегка приукрасить, это имя файла
C#
1
string tempFileSeceditOut = Path.GetTempFileName();
Добавлено через 1 минуту
Pablitto, а через ManagementObjectSearcher не пробовали?..

Добавлено через 8 минут
этот код у вас не работает?..
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        var options = new ConnectionOptions();
        var scope = new ManagementScope(@"\\.\root\RSOP\Computer", options);
 
        var objectQuery = new ObjectQuery("SELECT * FROM RSOP_SecuritySettingBoolean");
        using (var searcher = new ManagementObjectSearcher(scope, objectQuery))
        {
            foreach (ManagementObject o in searcher.Get())
            {
                Console.WriteLine("Key Name: {0}", o["KeyName"]);
                Console.WriteLine("Precedence: {0}", o["Precedence"]);
                Console.WriteLine("Setting: {0}", o["Setting"]);
            }
        }
1
1 / 1 / 1
Регистрация: 20.12.2011
Сообщений: 21
23.03.2014, 16:36  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Pablitto, а через ManagementObjectSearcher не пробовали?..
Добавлено через 8 минут
этот код у вас не работает?..
Я пробовал RSOP. Пробовал через SELECT * FROM RSOP_SecuritySettingBoolean...
На пк которые в домене - вывод нормальный.
На пк которые отдельно, не в домене - searcher.Get() ничего не находит, возвращает ноль.
Открыл rsop.msc на невдоменных ПК - там все Account Policies установлено в Not Defined.

С Благодарностью, Павел.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
24.03.2014, 23:01
Проверить негде, но подозреваю, что можно посмотреть где-то тут
HKEY_LOCAL_MACHINE\Software\Microsoft\Wi ndows\CurrentVersion\Policies\
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
24.03.2014, 23:13
Цитата Сообщение от Pablitto Посмотреть сообщение
Никак не могу найти подходящий способ получить значение параметра локальной политики безопасности (Политика учётных записей -> Политика паролей): "Пароль должен отвечать требованиям сложности" (Включен или Выключен).
А если не секрет - для чего это нужно ?
0
1 / 1 / 1
Регистрация: 20.12.2011
Сообщений: 21
25.03.2014, 04:58  [ТС]
Цитата Сообщение от xoraxax Посмотреть сообщение
Проверить негде, но подозреваю, что можно посмотреть где-то тут
HKEY_LOCAL_MACHINE\Software\Microsoft\Wi ndows\CurrentVersion \Policies\
Я первым делом тоже в реестре думал поискать. Но ничего не нашёл ни в HCM ни HLM...

Добавлено через 18 минут
Цитата Сообщение от Убежденный Посмотреть сообщение
А если не секрет - для чего это нужно ?
Клиент заказал сделать библиотеку по управлению локальными пользователями и группами.
С функционалом типа такого:
http://sergeyhomyuk.wordpress.... rs-groups/

Клиент пожелал чтобы туда входили методы типа:
1) CreateLocalUser(string userName, string password)
2) SetUserPassword(string userName, string newPswd)
Которые могут выдавать исключение, если пароль не будет соответствовать Security Policy

И оговорил, что хочет также метод на проверку пароля на соответствие минимальным требованиям безопасности в системе.

Вот я и создал ему метод PasswordCheckRequirements(string password, string userName).

Туда добавил код, что выше - по получению тех заветных значений:
1) MinimumPasswordLength
2) PasswordComplexity

и также код, уже на проверку самого пароля на соответствие Security Policy :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
if(PasswordComplexity == 1) // PasswordComplexity Enabled
                {
                    // Check password length
                    if(MinimumPasswordLength>8)
                    {
                        if(password.Length < MinimumPasswordLength)
                            return false.ToString();
                    }
                    else
                    {
                        if(password.Length < 8)
                            return false.ToString();
                    } // continue
                    
                    Match match = Regex.Match(password,userName); // check user name to Match
                    if(match.Success)
                        return false.ToString();
            
                    int complexityCount = 0;
                    
                    match = Regex.Match(password,@"[A-Z]"); // A-Z
                    if(match.Success) 
                        complexityCount++;
                    
                    match = Regex.Match(password,@"[a-z]"); // a-z
                    if(match.Success) 
                        complexityCount++;
                    
                    match = Regex.Match(password,@"[0-9]"); // 0-9
                    if(match.Success)
                        complexityCount++;
                    
                    match = Regex.Match(password,@"[\W_]"); // special Character:  ~!@#$%^&*()-_\+=<,>\.\?\/
                    if(match.Success)
                        complexityCount++;
                    
                    if(complexityCount<3) // 3 of 4
                    {
                        return false.ToString();
                    }
                    else
                    {
                        return true.ToString();
                    }

С уважением, Павел...

Добавлено через 23 минуты
Вот полный код метода:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
        /// <summary>
        /// Method to check password for minimum requirements
        /// </summary>
        /// <param name="password">password</param>
        /// <param name="userName">user name</param>
        /// <returns>string: "True" for success or message for error</returns>
        public static string PasswordCheckRequirements(string password, string userName)
        {
            try
            {           
                string tempFileSeceditOut = AppDomain.CurrentDomain.BaseDirectory + "seceditOut.txt"; // temp file
                
                // secedit.exe
                Process secedit = new Process();
                secedit.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\secedit.exe");
                secedit.StartInfo.Arguments = String.Format(@"/export /cfg ""{0}"" /quiet", tempFileSeceditOut);
                secedit.StartInfo.UseShellExecute = false;
                secedit.StartInfo.CreateNoWindow = true;
                secedit.Start();
                secedit.WaitForExit();
                
                // Read first 8 lines of temp file
                StreamReader readFile = new StreamReader(tempFileSeceditOut);
                
                List<string> fileReadLines = new List<string>();
                
                for(int i=0; i<8; i++)
                    fileReadLines.Add(readFile.ReadLine());
                
                readFile.Close();
                File.Delete(tempFileSeceditOut);
                
                int MinimumPasswordLength = Convert.ToInt32(fileReadLines[5].Split('=')[1].Trim());
                int PasswordComplexity = Convert.ToInt32(fileReadLines[6].Split('=')[1].Trim());
                
                if(PasswordComplexity == 1) // PasswordComplexity Enabled
                {
                    // Check password length
                    if(MinimumPasswordLength>8)
                    {
                        if(password.Length < MinimumPasswordLength)
                            return false.ToString();
                    }
                    else
                    {
                        if(password.Length < 8)
                            return false.ToString();
                    } // continue
                    
                    Match match = Regex.Match(password,userName); // check user name to Match
                    if(match.Success)
                        return false.ToString();
            
                    int complexityCount = 0;
                    
                    match = Regex.Match(password,@"[A-Z]"); // A-Z
                    if(match.Success) 
                        complexityCount++;
                    
                    match = Regex.Match(password,@"[a-z]"); // a-z
                    if(match.Success) 
                        complexityCount++;
                    
                    match = Regex.Match(password,@"[0-9]"); // 0-9
                    if(match.Success)
                        complexityCount++;
                    
                    match = Regex.Match(password,@"[\W_]"); // special Character:  ~!@#$%^&*()-_\+=<,>\.\?\/
                    if(match.Success)
                        complexityCount++;
                    
                    if(complexityCount<3) // 3 of 4
                    {
                        return false.ToString();
                    }
                    else
                    {
                        return true.ToString();
                    }
                        
                }
                else //PasswordComplexity Disabled
                {
                    if(password.Length < MinimumPasswordLength) // check MinimumPasswordLength
                    {
                        return false.ToString();
                    }
                    else
                    {
                        return true.ToString();
                    }
                }
                
            }
            catch (Exception exp) {return exp.Message;}
 
        }
С Уважением, Павел...
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
25.03.2014, 09:20
Цитата Сообщение от Pablitto Посмотреть сообщение
И оговорил, что хочет также метод на проверку пароля на соответствие минимальным требованиям безопасности в системе.
Я почему спросил - это все реально будет работать только в том случае,
если в системе не установлено никаких password filters (библиотеки,
которые проверяют дополнительные правила стойкости пароля на
основе каких-то своих правил). Информация здесь:

Password Filters (Windows)
http://msdn.microsoft.com/en-u... 85%29.aspx
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.03.2014, 09:20
Помогаю со студенческими работами здесь

Как изменить два параметра в локальной политике безопасности?
Maximum password age 0 Minimum password length 8 characters

Как получить параметры политики безопасности, установленной для текущего пользователя?
Как при помощи powershell получить параметры политики безопасности, установленной для текущего пользователя? Политика учетной записи -...

Изменение локальной политики безопасности - Сетевой доступ: модель совместного доступа
Привет всем. Нужна помощь с изменением параметра локальной политики безопасности: (Локальная политика безопасности -&gt; Локальные...

Как сделать коннект к базе данных, отвечающий требованиям безопасности
Всем Привет! Ситуация такая: 1. Есть клиентская прога (на Си-билдере), коннектится к Oracle через ADO. 2. Oracle стоит на...

Windows 7,8 групповые политики безопасности, как найти?
Коллеги, может я совсем серый, но как в Windows 7,8 проникнуть легально (из ОС) в групповую безопасность??? Через &quot;управление...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru