Существуют ли лучшие (более простые) способы получения SID конкретного домена? - PullRequest
5 голосов
/ 11 октября 2011

Мне поручили изменить приложение WinForms для проверки того, что вошедший в систему пользователь принадлежит определенному домену. Вот что я придумала до сих пор:

byte[] domainSid;

var directoryContext =
    new DirectoryContext(DirectoryContextType.Domain, "domain.se");

using (var domain = Domain.GetDomain(directoryContext))
using (var directoryEntry = domain.GetDirectoryEntry())
    domainSid = (byte[])directoryEntry.Properties["objectSid"].Value;

var sid = new SecurityIdentifier(domainSid, 0);
bool validUser = UserPrincipal.Current.Sid.IsEqualDomainSid(sid);

Есть ли лучший / более простой способ сделать это? Мне кажется, что domainSid был бы доступен каким-то образом с использованием PrincipalContext или другого класса в System.Security.Principal.

Я подумал об использовании жестко закодированной SID-строки, но я не знаю, насколько это "правильно".

Ответы [ 2 ]

5 голосов
/ 12 октября 2011

То, что вы делаете, выглядит для меня лучшим вариантом. Жесткое кодирование строк определенно не очень хорошая идея.

2 голосов
/ 07 апреля 2012

Каждый домен имеет встроенную учетную запись имя_домена \ администратор , поэтому вы можете создать учетную запись с этим именем, преобразовать ее в SecurityIdentifier и прочитать свойство AccountDomainSid. ​​

Примерэтот способ:

public static class SecurityEx
{
    public static SecurityIdentifier DomainSId
    {
        get
        {               
            var administratorAcount = new NTAccount(GetDomainName(), "administrator");
            var administratorSId = (SecurityIdentifier) administratorAcount.Translate(typeof (SecurityIdentifier));
            return administratorSId.AccountDomainSid;
        }
    }

    internal static string GetDomainName()
    {
        //could be other way to get the domain name through Environment.UserDomainName etc...
        return IPGlobalProperties.GetIPGlobalProperties().DomainName;
    }
}

Также вы можете найти другие решения для достижения того же результата через WMI или Lsa.Этот способ кажется мне самым элегантным.

...