/// <summary> /// Gibt ein ADElement der angefragten SID zurück. /// Überprüft alle User, Gruppen und Computer /// </summary> /// <param name="sid"></param> /// <returns></returns> public static ADElement GetADElement(string sid) { // Überprüft ob die übergebene SID ein User ist ADElement returnElement = GetADUser(sid); // Falls das Element gefunden wurde wird hier beendet und das Element zurückgegeben if (returnElement != null) { bool isUserAdmin = IsUserAdmin(sid); return(returnElement); } // Überprüft ob die übergebene SID eine Gruppe ist returnElement = GetADGroup(sid); // Falls das Element gefunden wurde wird hier beendet und das Element zurückgegeben if (returnElement != null) { return(returnElement); } // Überprüft ob die übergebene SID ein Computer ist returnElement = GetADComputer(sid); // Falls das Element gefunden wurde wird hier beendet und das Element zurückgegeben if (returnElement != null) { return(returnElement); } // Falls kein Element gefunden wurde wird return(null); }
/// <summary> /// Hilfsfunktion die alle Member einer Gruppe ausliest. /// </summary> /// <param name="groupAce">Das ACE der Gruppe die ausgelesen werden soll</param> /// <returns></returns> public static List <DirectoryACE> GetMemberInGroup(DirectoryACE groupAce) { // TODO: Die Abfrage muss noch geändert werden dass auch die Grppen zurückgegeben werden List <DirectoryACE> retList = new List <DirectoryACE>(); // erstellt eine MSSQL Verbindung und öffnet Sie var mssql = new MsSql(); mssql.Open(); // Der SQL Befehl um alle Ordner abzurufen die root sind string sql = $"SELECT gu.userSID, CASE WHEN u.SID IS NULL THEN 1 ELSE 0 END as _is_group, u.* " + $"FROM ARPS_Test.dbo.adgroups g " + $"JOIN ARPS_Test.dbo.grp_user gu " + $"ON g.SID = gu.grpSID " + $"LEFT JOIN ARPS_Test.dbo.adusers u " + $"ON u.SID = gu.userSID " + $"WHERE g.SID = @GroupSid "; // Sendet den SQL Befehl an den SQL Server SqlCommand cmd = new SqlCommand(sql, mssql.Con); //Parameter anhängen cmd.Parameters.AddWithValue("@GroupSid", groupAce.SID); // Benutzt den SQL Reader um über alle Zeilen der Abfrage zu gehen using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { // Speichert die Daten des Readers in einzelne Variablen bool isGroup = Convert.ToBoolean(reader["_is_group"]); string sid = reader["userSID"].ToString(); ADElement Element = ADStructure.GetADElement(sid); // falls das Element null ist wird die SID übersprungen if (Element == null) { continue; } // erstellt das ACE falls er aktiv oder eine Gruppe ist if (Element.Enabled || Element.Type == ADElementType.Group) { var nAce = new DirectoryACE( isGroup, (isGroup) ? Element.Name : reader["DisplayName"].ToString() + " (" + reader["UserPrincipalName"].ToString() + ")", "", -1, sid, groupAce.Rights, groupAce.Type, groupAce.FileSystemRight, groupAce.IsInherited, groupAce.InheritanceFlags, groupAce.PropagationFlags); // Falls das ACE eine Gruppe ist werden die Member der Gruppe rekursiv gefüllt if (isGroup) { nAce.Member = new List <DirectoryACE>(GetMemberInGroup(nAce)); } // Das ACE wird der Liste hinzugefügt die zurückgegeben wird retList.Add(nAce); } } } // Schließt die MSSQL verbindung mssql.Close(); return(retList); }