Laden...

Nutzer einer Gruppe sprachneutral(!) remote auslesen: "Administratoren" vs. "Administrators"

Erstellt von SeriouslyNot vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.556 Views
S
SeriouslyNot Themenstarter:in
13 Beiträge seit 2013
vor 9 Jahren
Nutzer einer Gruppe sprachneutral(!) remote auslesen: "Administratoren" vs. "Administrators"

Guten Morgen,

ich versuche mittels u.s. Methode alle Nutzer der Gruppe Administratoren auszulesen.
Funktioniert soweit auch ganz gut, einziges Problem sind verschiedene Sprachen. Im deutschen heißt die Gruppe "Administratoren", im englischen "Administrators" etc.
Kennt ihr eine Möglichkeit, statt dem exakten Namen der Gruppe anzugeben, die ganze Sache etwas Sprachneutraler zu gestalten?

private void GetUsers(String strHost, int Line)
        {
            using (DirectoryEntry groupEntry = new DirectoryEntry("WinNT://" + strHost + "/Administratoren,group"))
            {
                int i = 0;
                foreach (object member in (IEnumerable)groupEntry.Invoke("Members"))
                {
                    using (DirectoryEntry memberEntry = new DirectoryEntry(member))
                    {
                        string fullUser = memberEntry.Path;
                        char[] strTrim = { 'W', 'i', 'n', 'N', 'T', ':', '/', '/'};
                        string shortUser = fullUser.TrimStart(strTrim);
                        user[i] = shortUser;
                        dgvItems.Rows[Line].Cells[i+2].Value = user[i];
                        i += 1;
                    }
                }
            }
        }
16.806 Beiträge seit 2008
vor 9 Jahren

per SID: Bekannte Sicherheits-IDs in Windows-Betriebssystemen

Mit dem PrincipalContext (und einer Architektur wie Repositoy Pattern) würdest Du Dir das Leben zusätzlich leichter machen.

S
14 Beiträge seit 2010
vor 9 Jahren

Hallo!

Ich interessiere mich auch für so eine Lösung. Derzeit hab ich es über "net localgroup" gelöst und die Gruppen ausgelesen.

Also ich lese die SID aus für die Administratorgruppe und speiche sie in einem string.

var sidLocalAdmin = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);     
            var admingroup = sidLocalAdmin.Translate(typeof(NTAccount)).ToString();
            string admin = Regex.Match(admingroup, @".+\\(.+)", RegexOptions.Compiled).Groups[1].Value;

Aber derzeit liest er es ja nur auf den lokalen Rechner aus. Wie kann ich den auf einen anderen PC die Gruppe auslesen?

16.806 Beiträge seit 2008
vor 9 Jahren

Einfach einen PrincipalContext des anderen PCs erstellen und darauf die Abfrage ausführen.
Die PrincipalContext Klasse hat dafür passende Überladungen im Konstruktor. Siehe die verlinkte Doku.

Und bevor die Frage kommt: ja, auch die Admingruppe kriegt man über die passenden GroupPrincpal-Find()-Methoden

S
SeriouslyNot Themenstarter:in
13 Beiträge seit 2013
vor 9 Jahren

Hallo,

hab das jetzt mal probiert und folgendes ist dabei entstanden:

PrincipalContext ctx = new PrincipalContext(ContextType.Machine, strHost);
            GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Sid, "S-1-5-32-544");

Leider wirft er nur folgenden Felher aus:

Unbekannter Fehler (0x80005000)

16.806 Beiträge seit 2008
vor 9 Jahren

Folgendes geht bei mir:

            var adminGroupSID = "S-1-5-32-544";

            PrincipalContext ctx = new PrincipalContext( ContextType.Machine );
            GroupPrincipal grp = GroupPrincipal.FindByIdentity( ctx, IdentityType.Sid, adminGroupSID );

Wenns Remote nicht geht fehlen Dir wohl die Rechte.

S
14 Beiträge seit 2010
vor 9 Jahren

Also nach Abt's Code geht es nur, wenn ich die Gruppe auf meinen Server abrufen, auf einen anderen Client(gleicher Account mit Lokale Adminrechte) hab ich auch eine Zugriffsverweigerung.

16.806 Beiträge seit 2008
vor 9 Jahren

Gleicher Account, lokale Rechte?
Sowas gibt's nicht.

Entweder Du hast eine Domäne und Domänenrechte oder Du nutzt einen Nutzer, der auf der anderen Maschine bekannt ist und dort die nötigen Rechte hat. Dafür ist aber eine Impersonation notwendig.

S
SeriouslyNot Themenstarter:in
13 Beiträge seit 2013
vor 9 Jahren

Folgendes geht bei mir:

            var adminGroupSID = "S-1-5-32-544";  
  
            PrincipalContext ctx = new PrincipalContext( ContextType.Machine );  
            GroupPrincipal grp = GroupPrincipal.FindByIdentity( ctx, IdentityType.Sid, adminGroupSID );  

Wenns Remote nicht geht fehlen Dir wohl die Rechte.

Danke, das funktioniert - zumindest lokal. Wenn ich noch einen Host angebe, kommt folgender Fehler:

Fehlermeldung:
Die Bindungsnummer ist unzulässig.

S
14 Beiträge seit 2010
vor 9 Jahren

Liegt wirklich wohl an meinem Domainaccount.
Hab es jetzt in einer anderen Domäne probiert und das Funktioniert wunderbar. Kann jetzt ohne Probleme per Remote Benutzer zur gruppen hinzufügen oder löschen.

Funktioniert prächtig!

Vielen Dank