#active-directory #directoryservices #user-accounts
#active-directory #directoryservices #учетные записи пользователей
Вопрос:
Когда я получаю записи UserPrincipal / DirectoryEntry для компьютера или домена Active Directory, есть ли способ отличить системные учетные записи от реальных пользователей?
Например, jsmith является реальным пользователем, а ASPNET или IUSR_machine — нет. Но использование жестко закодированных известных имен, похоже, не лучший способ отфильтровать системных пользователей, потому что могут быть и другие учетные записи. Есть ли лучший способ?
Например, может быть установлен флаг «может входить в систему в интерактивном режиме» Или «определить, проверив, установлен ли пароль» и т. Д.
Ответ №1:
Примеры учетных записей, которые вы перечисляете, по сути, функционально такие же, как учетная запись пользователя, которую вы создаете для именованного пользователя.
Ответ №2:
Попробуйте использовать методы Win32 LookupAccountName и LookupAccountSid. Последний параметр (называемый AccountType) заполняется типом учетной записи, когда функция возвращает.
[SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool LookupAccountSid(
[In] string systemName,
[In, MarshalAs(UnmanagedType.LPArray)] byte[] sid,
[Out] StringBuilder name,
[In, Out] ref uint nameLength,
[Out] StringBuilder referencedDomainName,
[In, Out] ref uint referencedDomainNameLength,
[Out] out AccountType accountType);
[SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool LookupAccountName(
[In] string systemName,
[In] string accountName,
[Out, MarshalAs(UnmanagedType.LPArray)] byte[] sid,
[In, Out] ref uint sidSize,
[Out] StringBuilder referencedDomainName,
[In, Out] ref uint referencedDomainNameLength,
[Out] out AccountType accountType);
/// <summary>
/// Defines the various account types of a Windows accunt
/// </summary>
public enum AccountType
{
/// <summary>
/// No account type
/// </summary>
None = 0,
/// <summary>
/// The account is a user
/// </summary>
User,
/// <summary>
/// The account is a security group
/// </summary>
Group,
/// <summary>
/// The account defines a domain
/// </summary>
Domain,
/// <summary>
/// The account is an alias
/// </summary>
Alias,
/// <summary>
/// The account is a well-known group, such as BUILTINAdministrators
/// </summary>
WellknownGroup,
/// <summary>
/// The account was deleted
/// </summary>
DeletedAccount,
/// <summary>
/// The account is invalid
/// </summary>
Invalid,
/// <summary>
/// The type of the account is unknown
/// </summary>
Unknown,
/// <summary>
/// The account is a computer account
/// </summary>
Computer,
Label
}
Комментарии:
1. Не будет ли возвращаемый AccountType одинаковым для реальных пользователей и системных пользователей, т.е. AccountType. Пользователь будет возвращен для обоих?
2. Он вернет что-то вроде «псевдонима» для встроенной группы администраторов. Но я думаю, вы правы насчет пользователя ASPNET или IUSR_machine… Тогда ключом может быть интерактивная привилегия входа в систему..
Ответ №3:
Попробуйте использовать свойство «samaccountname», чтобы исключить учетные записи, которые не предназначены для пользователей или групп.