powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не удаётся корректно проверить статус доменной учётной записи (заблокирована или нет)
10 сообщений из 10, страница 1 из 1
Не удаётся корректно проверить статус доменной учётной записи (заблокирована или нет)
    #39129861
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Windows 7 x64; Компьютер в домене; .NET Framework 4.0.

Требуется проверить статус доменной учётной записи: заблокирована или нет. Использую код, помеченный в качестве ответа здесь .

Проверяю код на двух записях: заблокированной и не заблокированной. Статус заблокированной записи предварительно подтвердили администраторы. На всякий случай я попробовал зайти под заблокированной учёткой и получил сообщение, что мол аккаунт отключен, обратитесь к администрации, так что одна из записей 100% заблокирована.

Код: 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.
// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
 
// find a user
// Unlocked account
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "myAccount");
if (user != null) {
    string displayName = user.DisplayName;
 
    if (user.IsAccountLockedOut()) {
        Console.WriteLine("{0} is locked.", displayName);
    }
    else {
        Console.WriteLine("{0} is unlocked.", displayName); // I am here
    }
}
 
// find a user
// Locked account
UserPrincipal user2 = UserPrincipal.FindByIdentity(ctx, "lockedUserAccount");
if (user2 != null) {
    string displayName2 = user2.DisplayName;
 
    if (user2.IsAccountLockedOut()) {
        Console.WriteLine("{0} is locked.", displayName2);
    }
    else {
        Console.WriteLine("{0} is unlocked.", displayName2); // Oops... I am here again
    }
}



Однако по факту для обоих записей обозначенный код выдаёт идентичный результат - мол они обе не заблокированы... В качестве аккаунта указывал значение UserPrincipal.SamAccountName . Аккаунты уникальны в рамках домена.

Меня интересуют два вопроса:

1. Почему я получаю неверный результат?
2. Как получить правильный результат?

Спасибо
...
Рейтинг: 0 / 0
Не удаётся корректно проверить статус доменной учётной записи (заблокирована или нет)
    #39129882
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

ADS_UF_ACCOUNTDISABLE и ADS_UF_LOCKOUT - это два разных флага атрибута User-Account-Control учетки AD. Вас интересует состояние именно locked out, или всё-таки enabled? Если второе - то надо использовать AuthenticablePrincipal.Enabled (от которого UserPrincipal наследует аналогичное).
...
Рейтинг: 0 / 0
Не удаётся корректно проверить статус доменной учётной записи (заблокирована или нет)
    #39129914
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Спасибо! AuthenticablePrincipal.Enabled - то, что нужно! А какому свойству это соответствует в LDAP-запросе? А то если вызывать в цикле код

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
// This way of account status checking is VERY SLOWLY for 
// big count of users...
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain)) {
    using (UserPrincipal userPrincipal = UserPrincipal
        .FindByIdentity(ctx, account)) {
        isEnabled = userPrincipal.Enabled.Value;
    }
}


то на это уходит ОЧЕНЬ много времени....
...
Рейтинг: 0 / 0
Не удаётся корректно проверить статус доменной учётной записи (заблокирована или нет)
    #39129948
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

это соответсвует проверке (userAccountControl & 2)=2 (если true, то учетка заблокирована)
...
Рейтинг: 0 / 0
Не удаётся корректно проверить статус доменной учётной записи (заблокирована или нет)
    #39129973
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Ещё раз спасибо! Заменил предыдущий код на такой:
Код: c#
1.
2.
3.
4.
5.
if (record.ContainsKey("useraccountcontrol") &&
    record["useraccountcontrol"].Count > 0) {
    isEnabled = (((Int32)record["useraccountcontrol"][0])
        & 2) == 0;
}


Теперь информация извлекается за 1 секунду вместо 18-ти. Благодарю!
...
Рейтинг: 0 / 0
Не удаётся корректно проверить статус доменной учётной записи (заблокирована или нет)
    #39130005
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Вы не в курсе, как в LDAP запросе получить разрядность операционной системы компьютера (x86 или x64)?
...
Рейтинг: 0 / 0
Не удаётся корректно проверить статус доменной учётной записи (заблокирована или нет)
    #39130017
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumСон Веры Павловны,

Вы не в курсе, как в LDAP запросе получить разрядность операционной системы компьютера (x86 или x64)?
зайдите в оснастку Users & Computers, откройте компьютер на редактирование,
зайдите во вкладку Attribute Editor, поставьте галочку "Show only exist values" или как то так. Изучайте.

если с оснасткой проблема, есть еще одна AdsiEdit она идет в комплекте с виндой, но непредустановлена, найти можно в компонентах через Win+R => appwiz.cpl => Enter
...
Рейтинг: 0 / 0
Не удаётся корректно проверить статус доменной учётной записи (заблокирована или нет)
    #39130039
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumСон Веры Павловны,

Вы не в курсе, как в LDAP запросе получить разрядность операционной системы компьютера (x86 или x64)?
Я сомневаюсь, что это вообще можно получить - из известных мне трех атрибутов учетки компьютера, содержащих сведения об ОС (Operating-System, Operating-System-Hotfix, Operating-System-Service-Pack) ни один не содержит сведений о разрядности ОС. Думаю, тут нужно смотреть в сторону remote WMI.
И да, если вам нужно определять заблокированность/незаблокированность учетной записи не в цикле, а задавать как условие LDAP-запроса, то изучите вот это (эти фильтры вполне применимы для DirectorySearcher).
...
Рейтинг: 0 / 0
Не удаётся корректно проверить статус доменной учётной записи (заблокирована или нет)
    #39130056
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловныиз известных мне трех атрибутов учетки компьютера, содержащих сведения об ОС (Operating-System, Operating-System-Hotfix, Operating-System-Service-Pack) ни один не содержит сведений о разрядности ОС.
Эти свойства я получил до того, как задать вопрос. Для полноты картины не хватает разрядности ОС.

Сон Веры ПавловныИ да, если вам нужно определять заблокированность/незаблокированность учетной записи не в цикле, а задавать как условие LDAP-запроса, то изучите вот это (эти фильтры вполне применимы для DirectorySearcher).
Я это видел и на основе этой информации как раз и создаю фильтры. Проблема иногда возникает в том, какое свойство нужно смотреть в той или иной ситуации и как трактовать его значение (не всегда это очевидно). На данный момент все интересующие меня свойства, по отношению к компьютерам и пользователям я получаю успешно (за исключением разрядности ОС).

Сон Веры ПавловныДумаю, тут нужно смотреть в сторону remote WMI.
Спасибо, попробую. Возможно через WMI удастся получить и аккаунты учётных записей, имеющихся на удалённой машине, а так же проверить каждую из них на наличие административных прав на том компьютере. На данный момент наличие таких учёток я определяю через удалённый реестр, но эту операцию приходится выполнять с правами админа, т.к. соответствующая служба в Win7 и новее по умолчанию отключена (т.о. приходится на время запроса программно включать её и затем отключать).
...
Рейтинг: 0 / 0
Не удаётся корректно проверить статус доменной учётной записи (заблокирована или нет)
    #39130101
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныДумаю, тут нужно смотреть в сторону remote WMI.
Сделал так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
ConnectionOptions options = new ConnectionOptions();
// Username & Password are necessary when process hasn't admin rights.
options.Username = @"domainName\adminAccount";
options.Password = "adminPassword";

ManagementScope scope = new ManagementScope(@"\\remoteMachineName\root\cimv2",
    options);
ObjectQuery query = new ObjectQuery(
    "SELECT OSArchitecture FROM Win32_OperatingSystem");

using (ManagementObjectSearcher searcher =
    new ManagementObjectSearcher(scope, query))
using (ManagementObjectCollection queryCollection = searcher.Get()) {
    foreach (var item in queryCollection) {
        foreach (var prop in item.Properties) {
            Console.WriteLine("{0}: {1}", prop.Name, prop.Value); // OSArchitecture: 64-bit
        }
    }
}
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не удаётся корректно проверить статус доменной учётной записи (заблокирована или нет)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]