/// <summary> /// Ruft die ACEs der User ab und speichert sie /// </summary> public void FillAllAuthorizedUserACE() { //Prüft ob die ACEs schon gefüllt sind if (ACEs == null) { FillACEs(); } AllAuthorizedACE = new DirectoryACE("-"); AllAuthorizedACE.Member = new List <DirectoryACE>(DirectoryStructure.GetAllAuthorizedUser(ACEs)); List <DirectoryACE> AllAces = new List <DirectoryACE>(); foreach (var ace in AllAuthorizedACE.Member) { AllAces.Add(ace); if (ace.Member != null) { foreach (var ace2 in ace.Member) { AllAces.Add(ace2); if (ace2.Member != null) { AllAces.AddRange(ace2.Member); } } } } var grpList = AllAces.GroupBy(u => u.SID).ToList(); foreach (var ace in AllAuthorizedACE.Member) { IGrouping <string, DirectoryACE> match = grpList.FirstOrDefault(a => a.Key == ace.SID); ace.rightCount = match.Count(); if (ace.Member != null) { foreach (var ace2 in ace.Member) { IGrouping <string, DirectoryACE> match2 = grpList.FirstOrDefault(a => a.Key == ace2.SID); ace2.rightCount = match2.Count(); if (ace2.Member != null) { foreach (var ace3 in ace2.Member) { IGrouping <string, DirectoryACE> match3 = grpList.FirstOrDefault(a => a.Key == ace3.SID); ace3.rightCount = match3.Count(); } } } } } }
/// <summary> /// Klappt das Verzeichnis auf und findet alle Kinder /// </summary> private void Expand() { // Item hat keine Kinder und kann daher nicht aufgeklappt werden if (CanExpand == false) { return; } // Finde alle Kinder // erstellt eine MSSQL Verbindung und öffnet Sie var mssql = new MsSql(); mssql.Open(); // Überschreibt die Liste Kinder mit einer neuen leeren Liste Children = new ObservableCollection <PermissionItem>(); foreach (ADElement group in AllGroups) { // Der SQL Befehl string sql = $"SELECT ace.*, d.* " + $"FROM [ARPS_Test].[fs].[aces] ace " + $"LEFT JOIN ARPS_Test.fs.acls acl " + $"ON acl._ace_id = ace._ace_id " + $"JOIN ARPS_Test.fs.dirs d " + $"ON acl._path_id = d._path_id " + $"WHERE acl._type = 0 " + $"AND d._parent_path_id = @ParentId " + $"AND ace._sid = @Sid"; // Sendet den SQL Befehl an den SQL Server SqlCommand cmd = new SqlCommand(sql, mssql.Con); //Parameter anhängen cmd.Parameters.AddWithValue("@Sid", group.SID); cmd.Parameters.AddWithValue("@ParentId", PathID); // Benutzt den SQL Reader um über alle Zeilen der Abfrage zu gehen using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { int _ace_id = (int)reader["_ace_id"]; string _sid = reader["_sid"].ToString(); FileSystemRights _rights = (FileSystemRights)reader["_rights"]; bool _type = Convert.ToBoolean(reader["_type"]); string _fsr = reader["_fsr"].ToString(); bool _is_inherited = Convert.ToBoolean(reader["_is_inherited"]); int _inheritance_flags = (int)reader["_inheritance_flags"]; int _propagation_flags = (int)reader["_propagation_flags"]; int _path_id = (int)reader["_path_id"]; string _unc_path_name = reader["_path_name"].ToString(); string _owner_sid = reader["_owner_sid"].ToString(); bool _has_children = Convert.ToBoolean(reader["_has_children"]); long _size = (long)reader["_size"]; bool _hidden = IsHidden; // Legt für die ausgelesene Zeile ein neues PermissionItem an in dem alle Infos über diesen Ordner gespeichert sind PermissionItem newPI = new PermissionItem(_path_id, _unc_path_name, _owner_sid, _has_children, _size, _hidden, AllGroups, DirectoryItemType.Folder); // Legt für die ausgelesene Zeile ein neues ACE an in dem alle Infos über das Rechte Objekt angeben sind DirectoryACE newACE = new DirectoryACE(_sid, _rights, _type, _fsr, _is_inherited, _inheritance_flags, _propagation_flags); // Falls keine Rechte in diesem Datensatz vergeben werden oder wenn die Rechte nur auf Unterordner gelten // wird der Datensatz nicht hinzugefügt if (newACE.Rights <= 0) { continue; } // Prüft ob das PermissionItem schon in der Liste vorhanden ist. PermissionItem value = Children.FirstOrDefault(item => item.PathID == newPI.PathID); // Falls der Pfad schon vorhanden ist wird das neue ACE Object dem bestehenden PermissionItem hinzugefügt if (value != null) { // Das neue ACE Objekt wird dem Permission Item (Ordner) hinzugefügt value.directoryACEs.Add(newACE); } // Falls das PermissionItem noch nicht vorhanden ist, wird das PerItem hinzugefügt und das neue Ace wird ihm hinzugefügt else { // Fügt das neue ACE dem neuen PerItem hinzu newPI.directoryACEs.Add(newACE); // Fügt das neue PerItem der Collection hinzu Children.Add(newPI); } } } } }
public NTFSEntry(DirectoryACE ace) { }
/// <summary> /// Hilfsfunktion die alle Member einer Gruppe ausliest. Falls Gruppen in Gruppen sind wir diese Funktion auch rekursiv aufgerufen /// </summary> /// <param name="groupAce">Das ACE der Gruppe die ausgelesen werden soll</param> /// <returns></returns> public static List <DirectoryACE> GetOnlyUserInGroup(DirectoryACE groupAce) { 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()) { bool isGroup = Convert.ToBoolean(reader["_is_group"]); string sid = reader["userSID"].ToString(); // Wenn die aktuelle Zeile eine Gruppe ist wird die Funktion Rekursiv aufgerufen if (isGroup) { // Fügt die Rückgabewert der rekursiven Funktion an die Liste an retList.AddRange(GetOnlyUserInGroup(new DirectoryACE( sid, groupAce.Rights, groupAce.Type, groupAce.FileSystemRight, groupAce.IsInherited, groupAce.InheritanceFlags, groupAce.PropagationFlags))); } else // Falls die Zeile ein User ist wir aus dem User ein PseudoACE erstellt und an die Liste angehängt { // Speichert die Daten des Readers in einzelne Variablen string displayName = reader["DisplayName"].ToString(); string samAccountName = reader["SamAccountName"].ToString(); string distinguishedName = reader["DistinguishedName"].ToString(); string userPrincipalName = reader["UserPrincipalName"].ToString(); bool enabled = Convert.ToBoolean(reader["Enabled"]); // erstellt den User falls er aktiv ist if (enabled) { retList.Add(new DirectoryACE( false, displayName + " (" + userPrincipalName + ")", userPrincipalName, -1, sid, groupAce.Rights, groupAce.Type, groupAce.FileSystemRight, groupAce.IsInherited, groupAce.InheritanceFlags, groupAce.PropagationFlags)); } } } } // Schließt die MSSQL verbindung mssql.Close(); return(retList); }
/// <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); }
/// <summary> /// Füllt die Shares in ein Übergeordnetes Server Element und fügt alles dem Property DisplayedItems hinzu /// </summary> public void FillItemsWithShares() { var Shares = new ObservableCollection <PermissionItem>(); // erstellt eine MSSQL Verbindung und öffnet Sie var mssql = new MsSql(); mssql.Open(); foreach (ADElement group in AllGroups) { // Der SQL Befehl um alle Ordner abzurufen die root sind string sql = $"SELECT ace.*, s.* " + $"FROM [ARPS_Test].[fs].[aces] ace " + $"LEFT JOIN ARPS_Test.fs.acls acl " + $"ON acl._ace_id = ace._ace_id " + $"JOIN ARPS_Test.fs.shares s " + $"ON acl._path_id = s._path_id " + $"WHERE acl._type = 1 " + $"AND ace._sid = @Sid"; // Sendet den SQL Befehl an den SQL Server SqlCommand cmd = new SqlCommand(sql, mssql.Con); //Parameter anhängen cmd.Parameters.AddWithValue("@Sid", group.SID); // Benutzt den SQL Reader um über alle Zeilen der Abfrage zu gehen using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { int _ace_id = (int)reader["_ace_id"]; string _sid = reader["_sid"].ToString(); FileSystemRights _rights = (FileSystemRights)reader["_rights"]; bool _type = Convert.ToBoolean(reader["_type"]); string _fsr = reader["_fsr"].ToString(); bool _is_inherited = Convert.ToBoolean(reader["_is_inherited"]); int _inheritance_flags = (int)reader["_inheritance_flags"]; int _propagation_flags = (int)reader["_propagation_flags"]; int _path_id = (int)reader["_path_id"]; string _unc_path_name = reader["_unc_path_name"].ToString(); string _owner_sid = reader["_owner_sid"].ToString(); bool _has_children = Convert.ToBoolean(reader["_has_children"]); long _size = (long)reader["_size"]; string _path_name = reader["_path_name"].ToString(); string _display_name = reader["_display_name"].ToString(); string _remark = reader["_remark"].ToString(); string _share_type = reader["_share_type"].ToString(); bool _hidden = Convert.ToBoolean(reader["_hidden"]); // Legt für die ausgelesene Zeile ein neues PermissionItem an in dem alle Infos über diesen Ordner gespeichert sind PermissionItem newPI = new PermissionItem(_path_id, _unc_path_name, _owner_sid, _has_children, _size, _hidden, AllGroups, DirectoryItemType.SharedFolder); // Legt für die ausgelesene Zeile ein neues ACE an in dem alle Infos über das Rechte Objekt angeben sind DirectoryACE newACE = new DirectoryACE(_sid, _rights, _type, _fsr, _is_inherited, _inheritance_flags, _propagation_flags); // Falls keine Rechte in diesem Datensatz vergeben werden oder wenn die Rechte nur auf Unterordner gelten // wird der Datensatz nicht hinzugefügt if (newACE.Rights <= 0) { continue; } // Prüft ob das PermissionItem schon in der Liste vorhanden ist. PermissionItem value = Shares.FirstOrDefault(item => item.PathID == newPI.PathID); // Falls der Pfad schon vorhanden ist wird das neue ACE Object dem bestehenden PermissionItem hinzugefügt if (value != null) { // Das neue ACE Objekt wird dem Permission Item (Ordner) hinzugefügt value.directoryACEs.Add(newACE); } // Falls das PermissionItem noch nicht vorhanden ist, wird das PerItem hinzugefügt und das neue Ace wird ihm hinzugefügt else { // Fügt das neue ACE dem neuen PerItem hinzu newPI.directoryACEs.Add(newACE); // Fügt das neue PerItem der Collection hinzu Shares.Add(newPI); } } } } // Sortiert die Liste mit Shares var sortedShares = from item in Shares orderby item.FolderName select item; DisplayedItems = new ObservableCollection <PermissionItem>(); foreach (var share in sortedShares) { // Sucht ob der Server des Share Element schon vorhanden ist PermissionItem value = DisplayedItems.FirstOrDefault(item => item.ServerName == share.ServerName); // Falls der Server noch nicht vorhanden ist if (value == null) { // Ein neuer Server wird erstellt var newServer = new PermissionItem(share.ServerName); // Das aktuelle Share Element wird dem Server als Kind hinzugefügt newServer.Children.Add(share); // Der neue Server wird der Liste hinzugefügt DisplayedItems.Add(newServer); } else { // Falls der Server schon vorhanden ist wird das Share Element dem Server als Kind hinzugefügt value.Children.Add(share); } } // Schließt die MSSQL verbindung mssql.Close(); }