/// <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); } } } } }
/// <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(); }