Ho un SID di un account utente e desidero i SID dei gruppi a cui appartiene

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

  •  21-09-2019
  •  | 
  •  

Domanda

Questo deve essere ottenuto da una macchina remota.La query seguente non funziona per i SID, ma per i nomi di gruppi e account.

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

Gli oggetti Win32_Group restituiti si presentano sotto forma di stringhe e hanno solo dominio e nome (anche se Win32_Group ha una proprietà SID).

Ho questa sensazione di sprofondamento che dovrò:

  1. Trasforma il SID in un nome account eseguendo una query su Win32_SID;
  2. Esegui la query sopra;
  3. Giro ogni dei nomi dei gruppi risultanti nei SID eseguendo una query su Win32_Group.
È stato utile?

Soluzione

Puoi usare il System.DirectoryServices.AccountManagement classi dello spazio dei nomi?

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

Dovrebbe funzionare con ContextType.Machine, anche se dovresti specificare il nome della macchina e disporre dei privilegi appropriati.

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

C'è un bel MSDN articolo (lungo, però) sull'utilizzo del nuovo spazio dei nomi di gestione degli account .NET 3.5.

Altri suggerimenti

Sì, esiste, ma alcuni metodi dipendono dall'avere un dominio.

  1. Guarda questo pagina per informazioni su come convertire un SID a un ID utente usando P/Invoke e l'API di Windows oppure con .NET 2.0+ e nessun P/Invoke.

    utilizzando System.Security.Principal;

    Convertire il SID utente in un dominio ome string account = new SecurityIdentifier(stringSid). Translate(typeof(NTAccount)). ToString();

  2. Se hai AD e l'ID utente in esso contenuto, quindi utilizzare il DirectorySearcher metodo o API di gestione dell'account per trovare i gruppi.Altrimenti utilizzare il metodo descritto inQuesto articolo per ottenere locale Gruppi.

  3. Ora utilizza l'API suggerita da @tvanfosson per scorrere i gruppi e ottenere i SID.Oppure segui le informazioni qui sotto.

In un'applicazione ASP.NET è possibile usare codice come questo per accedere alle informazioni sul gruppo a condizione che un utente sia autenticato da Windows e non dall'autenticazione basata su form.In questo esempio ho lasciato una nota interessante sulle eccezioni generate in quell'ambiente ma che potrebbe applicarsi ad altri utenti:

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 si basa su WindowsIdentità classe.Potresti modificare il mio esempio di codice per utilizzare WindowsIdentity e funzionare in un'applicazione non Web.Una volta eseguito l'iterazione su un gruppo dovresti essere in grado di fare qualcosa del genere per ottenere SecurityIdentifier:

SecurityIdentifier secid = group as SecurityIdentifier;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top