Tengo un SID de una cuenta de usuario, y quiero que los SID de los grupos a los que pertenece

StackOverflow https://stackoverflow.com/questions/2495185

  •  21-09-2019
  •  | 
  •  

Pregunta

Esto tiene que ser obtenido a partir de una máquina remota. La siguiente consulta funciona no para SID, pero para los nombres de grupos y de cuenta.

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

El Win32_Group objetos se vuelve vienen en las formas de cuerdas, y sólo tienen dominio y el nombre (a pesar de que tiene una propiedad Win32_Group SID).

He esta sensación de hundimiento voy a tener que:

  1. Girar el SID en un nombre de cuenta mediante la consulta Win32_SID;
  2. Realizar la consulta anterior;
  3. Activar cada de los nombres de los grupos resultantes en SID por la consulta de Win32_Group.
¿Fue útil?

Solución

¿Se puede utilizar el System.DirectoryServices.AccountManagement clases de espacio de nombres?

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
    }
}

Se debe trabajar con ContextType.Machine, aunque se necesitaría para especificar el nombre de la máquina y tienen privilegios adecuados.

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

Hay un buen MSDN artículo (algo largo, sin embargo) en utilizando el nuevo espacio de nombres .NET 3.5 gestión de cuentas.

Otros consejos

Si no hay más que algunos métodos dependen de tener un dominio.

  1. página de cómo convertir un SID a un ID de usuario de P / Invoke y la API de Windows, o con .NET 2.0+ y no P / Invoke.

    usando System.Security.Principal;

    // convertir el SID de usuario a un dominio \ nombre cuenta String = nuevo SecurityIdentifier (stringSid) .Translate (typeof (NTAccount)) ToString ();.

  2. Si usted tiene AD y el ID de usuario en allí a continuación, utilizar la DirectorySearcher Método o API de administración de la cuenta para encontrar los grupos. De lo contrario usar el método descrito en este artículo llegar locales grupos.

  3. Ahora utilice la API sugerido por @tvanfosson para iterar los grupos y obtener el SID. O seguir la información a continuación.

En una aplicación ASP.NET, es posible usar un código como éste a info grupo de acceso proporciona un usuario es autenticado por Windows y no autenticación de formularios. En este ejemplo he dejado una nota interesante acerca de las excepciones que se tiran en ese ambiente pero puede aplicarse a otros usuarios:

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 se basa en la WindowsIdentity clase. Se podría modificar mi código de ejemplo para usar WindowsIdentity y función en una aplicación no web. Una vez que iterar sobre un grupo que debe ser capaz de hacer algo como esto para conseguir la SecurityIdentifier:

SecurityIdentifier secid = group as SecurityIdentifier;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top