C-Sharp, Doamin-User, LocalAdminRigths und System.Security.Principal
Hallo @ All
Ich habe eine Verständnis-Frage auf die ich im Netz nicht wirklich eine grundlegende Antwort finden konnte. Ich hoffe nun, dass sich jemand aus der findigen Administrator.de - Community auskennt
Info:
DC OS = Server 2016
Client OS = Window10 x64
Die Vorgeschichte:
In einer Domain gibt es unter anderem einen Benutzer-Gruppe "LocalAdmins" die via GPO am Domain-Controller auf bekanntem Wege verteilt wird. Der Gruppe ("LocalAdmins") ist ein Domain-User "User1" hinzugefügt. auf dem Domain-Client findet sich nun in der Gruppe Administrators, die Gruppe "LocalAdmins". Der Domain-User "User1" hat lokale Admin-Rechte.
EDIT: wie unten von @136037 ganz richtig erklärt, prüft diese Methode nur ob der Process als Admin läuft
Wenn ich ein C-Sharp-Project als User1 ausführe und anschließend im Project prüfe ob der Benutzer administrative Rechte hat, bekomme ich False zurück.
Ich führe das darauf hin zurück, dass hier nur lokale Rechte geprüft werden. Deshalb habe ich mithilfe von Goolge meine Abfrage etwas erweitert und bin auf diesen Artikel gestoßen: https://lluisfranco.com/2010/12/13/how-to-check-if-current-user-is-membe ...
Diese Methode liefert aber ebenfalls False obwohl ich sicher bin, dass User1 lokale Administrations-Rechte hat.
Die Frage:
EDIT:
Was muss ich tun (steh voll am Schlauch) um zu prüfen ob Domain-User "xy" lokale Admin-Rechte hat?
Warum findet die Methode via Directory Context nicht heraus, dass der Domain-User lokale Adminrights hat? Was muss ich ändern?
Vielen Dank im Voraus für eure Unterstützung!
Grüße!
Mayho
Ich habe eine Verständnis-Frage auf die ich im Netz nicht wirklich eine grundlegende Antwort finden konnte. Ich hoffe nun, dass sich jemand aus der findigen Administrator.de - Community auskennt
Info:
DC OS = Server 2016
Client OS = Window10 x64
Die Vorgeschichte:
In einer Domain gibt es unter anderem einen Benutzer-Gruppe "LocalAdmins" die via GPO am Domain-Controller auf bekanntem Wege verteilt wird. Der Gruppe ("LocalAdmins") ist ein Domain-User "User1" hinzugefügt. auf dem Domain-Client findet sich nun in der Gruppe Administrators, die Gruppe "LocalAdmins". Der Domain-User "User1" hat lokale Admin-Rechte.
EDIT: wie unten von @136037 ganz richtig erklärt, prüft diese Methode nur ob der Process als Admin läuft
Wenn ich ein C-Sharp-Project als User1 ausführe und anschließend im Project prüfe ob der Benutzer administrative Rechte hat, bekomme ich False zurück.
private static bool CheckAdminRights()
{
bool toReturn = false;
using (WindowsIdentity identity = WindowsIdentity.GetCurrent())
{
WindowsPrincipal principal = new WindowsPrincipal(identity);
toReturn = principal.IsInRole(WindowsBuiltInRole.Administrator);
}
return toReturn;
}
Ich führe das darauf hin zurück, dass hier nur lokale Rechte geprüft werden. Deshalb habe ich mithilfe von Goolge meine Abfrage etwas erweitert und bin auf diesen Artikel gestoßen: https://lluisfranco.com/2010/12/13/how-to-check-if-current-user-is-membe ...
Diese Methode liefert aber ebenfalls False obwohl ich sicher bin, dass User1 lokale Administrations-Rechte hat.
Die Frage:
EDIT:
Was muss ich tun (steh voll am Schlauch) um zu prüfen ob Domain-User "xy" lokale Admin-Rechte hat?
Vielen Dank im Voraus für eure Unterstützung!
Grüße!
Mayho
Please also mark the comments that contributed to the solution of the article
Content-ID: 372598
Url: https://administrator.de/contentid/372598
Printed on: December 10, 2024 at 00:12 o'clock
6 Comments
Latest comment
principal.IsInRole(WindowsBuiltInRole.Administrator);
Das sagt nicht aus ob jemand Admin-Rechte hat sondern sagt nur aus das der Prozess nicht elevated gestartet wurde. Man muss den Prozess also erst mal mit dem Verb "runas" elevated starten (was die UAC triggert), erst dann ist diese Eigenschaft true .Gruß
Dann hol dir doch einfach die lokalen Gruppenmitglieder und vergleiche die SID des Users.
In einem Domain-verwaltetem Netzwerk nützen die lokalen User nicht viel.
Quark, die lokalen Gruppen habe enthalten die Doimain-Gruppen und die kannst du auch rekursiv auslesen. Geht aber noch einfacher mit PrincipalContext:Folgendes Assembly hinzufügen (System.DirectoryServices.AccountManagement)
private static bool IsAdministrator(string username)
{
PrincipalContext ctx;
try
{
Domain.GetComputerDomain();
try
{
ctx = new PrincipalContext(ContextType.Domain);
}
catch (PrincipalServerDownException)
{
// can't access domain, check local machine instead
ctx = new PrincipalContext(ContextType.Machine);
}
}
catch (ActiveDirectoryObjectNotFoundException)
{
// not in a domain
ctx = new PrincipalContext(ContextType.Machine);
}
var up = UserPrincipal.FindByIdentity(ctx, username);
if (up != null)
{
PrincipalSearchResult<Principal> authGroups = up.GetAuthorizationGroups();
return authGroups.Any(principal =>
principal.Sid.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid) ||
principal.Sid.IsWellKnown(WellKnownSidType.AccountDomainAdminsSid) ||
principal.Sid.IsWellKnown(WellKnownSidType.AccountAdministratorSid) ||
principal.Sid.IsWellKnown(WellKnownSidType.AccountEnterpriseAdminsSid));
}
return false;
}
Add-Type -A System.DirectoryServices.AccountManagement
$context = [System.DirectoryServices.AccountManagement.PrincipalContext]::new([System.DirectoryServices.AccountManagement.ContextType]::Domain)
$user = [System.DirectoryServices.AccountManagement.UserPrincipal]::FindByIdentity($context,$env:Username)
$user.GetAuthorizationGroups().Sid.IsWellKnown([System.Security.Principal.WellKnownSidType]::BuiltinAdministratorsSid) -eq $true