Разница между учетными записями реального пользователя и системного пользователя

#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», чтобы исключить учетные записи, которые не предназначены для пользователей или групп.