У меня есть SID учетной записи пользователя, и я хочу SIDs групп, которым он принадлежит

Это должно быть получено из удаленной машины. Следующие работы запроса не для SIDs, а для группы и имен учетной записи.

"SELECT GroupComponent FROM Win32_GroupUser WHERE PartComponent = \"Win32_UserAccount.Domain='" + accountDomain + "',Name='" + accountName + "'\""

Win32_Group возражает, что возвращается, прибывают в формы строк, и у них только есть домен и имя (даже при том, что Win32_Group имеет свойство SID).

У меня есть это дурное чувство, к которому я буду иметь:

  1. Превратите SID на имя учетной записи путем запросов Win32_SID;
  2. Выполните запрос выше;
  3. Превратите каждое из получающихся названий группы в SIDs путем запросов Win32_Group.
7
задан John Saunders 22 March 2010 в 19:56
поделиться

2 ответа

Можете ли вы использовать классы пространства имен System.DirectoryServices.AccountManagement ?

using (var context = new PrincipalContext( ContextType.Domain ))
{
    using (var user = UserPrincipal.FindByIdentity( context, accountName ))
    {
        var groups = user.GetAuthorizationGroups();
        ...iterate through groups and find SIDs for each one
    }
}

Он должен работать с ContextType.Machine, хотя вы ' d необходимо указать имя машины и иметь соответствующие привилегии.

using (var context = new PrincipalContext( ContextType.Machine,
                                           "MyComputer",
                                           userid,
                                           password ))
{
   ...
}

Есть хорошая статья MSDN (хотя и длинная) об использовании нового пространства имен для управления учетными записями .NET 3.5.

3
ответ дан 7 December 2019 в 09:59
поделиться

Да, есть, но некоторые методы зависят от наличия домена.

  1. См. эту страницу о том, как преобразовать SID в идентификатор пользователя, используя P/Invoke и Windows API, или в .NET 2.0+ без P/Invoke.

    using System.Security.Principal;

    // конвертируем пользовательский sid в домен\name string account = new SecurityIdentifier(stringSid).Translate(typeof(NTAccount)).ToString();

  2. Если у вас есть AD и идентификатор пользователя в нем, то используйте метод DirectorySearcher метод или API управления учетными записями для поиска групп. В противном случае используйте метод, описанный в этой статье, чтобы получить локальные группы.

  3. Теперь используйте API, предложенный @tvanfosson, для итерации групп и получения SID. Или следуйте приведенной ниже информации.

В приложении ASP.NET можно использовать подобный код для доступа к информации о группах, если пользователь аутентифицирован Windows, а не Forms-аутентификацией. В этом примере я оставил интересную заметку об исключениях, которые возникают в этой среде, но она может быть применима и к другим пользователям:

public List<string> GetGroupsFromLogonUserIdentity()
{
    List<string> groups = new List<string>();
    HttpRequest request = HttpContext.Current.Request;

    if (request.LogonUserIdentity.Groups != null)
    {
        foreach (IdentityReference group in request.LogonUserIdentity.Groups)
        {
            try
            {
                groups.Add(group.Translate(typeof(NTAccount)).ToString());
            }
            catch (IdentityNotMappedException)
            {
                // Swallow these exceptions without throwing an error. They are
                // the result of dead objects in AD which are associated with
                // user accounts. In this application users may have a group
                // name associated with their AD profile which cannot be
                // resolved in the Active Directory.
            }
        }
    }

    return groups;
}

LogonUserIdentity основан на классе WindowsIdentity. Вы можете модифицировать мой пример кода, чтобы использовать WindowsIdentity и функционировать не в Web-приложении. После итерации по группе вы должны быть в состоянии сделать что-то вроде этого, чтобы получить SecurityIdentifier:

SecurityIdentifier secid = group as SecurityIdentifier;
3
ответ дан 7 December 2019 в 09:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: