/// <summary> /// Standard Konstruktor /// </summary> public OU() { // erstellt und öffnet eine neue MsSql Verbindung mssql = new MsSql(); mssql.Open(); // Erzeugt eine neue Liste mit Einträgen Entrys = new List <CountEnrty>(); #region Computer Entrys.Add(new CountEnrty { Name = "Computer", Count = GetCountComputers().ToString() }); #endregion #region Computer (deaktiviert) Entrys.Add(new CountEnrty { Name = "Computer (deaktiviert)", Count = GetCountDisabledComputers().ToString() }); #endregion #region Benutzte OUs Entrys.Add(new CountEnrty { Name = "Benutzte OUs", Count = GetCountOU().ToString() }); #endregion mssql.Close(); }
/// <summary> /// Fragt die Datenbank nach der übergebenen sid ab und gibt ein ADElement zurück /// </summary> /// <param name="sid"></param> /// <returns></returns> public static ADElement GetADGroup(string sid) { // 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 * " + $"FROM {mssql.TBL_AD_Groups} " + $"WHERE SID = @Sid"; // Sendet den SQL Befehl an den SQL Server SqlCommand cmd = new SqlCommand(sql, mssql.Con); //Parameter anhängen cmd.Parameters.AddWithValue("Sid", 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 string name = reader["Name"].ToString(); string samAccountName = reader["SamAccountName"].ToString(); string distinguishedName = reader["DistinguishedName"].ToString(); string description = reader["Description"].ToString(); bool isSecurityGroup = Convert.ToBoolean(reader["IsSecurityGroup"]); string groupScopeString = reader["GroupScope"].ToString(); GroupScope groupScope; switch (groupScopeString) { case "Global": groupScope = GroupScope.Global; break; case "Local": groupScope = GroupScope.Local; break; default: groupScope = GroupScope.Universal; break; } // Schließt die MSSQL verbindung mssql.Close(); return(new ADElement(sid, name, samAccountName, distinguishedName, description, isSecurityGroup, groupScope)); } } // Schließt die MSSQL verbindung mssql.Close(); return(null); }
/// <summary> /// Gibt eine Liste mit allen angegebenen Servers zurück. /// </summary> /// <param name="serverNames"></param> /// <returns></returns> public static List <DirectoryItem> GetServers() { // 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 _unc_path_name FROM {mssql.TBL_FS_Shares}"; // Sendet den SQL Befehl an den SQL Server SqlCommand cmd = new SqlCommand(sql, mssql.Con); List <string> ListOfServers = new List <string>(); // Benutzt den SQL Reader um über alle Zeilen der Abfrage zu gehen using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { // Liest der Wert der SQL abfrage und gibt den Servernamen zurück string serverName = GetServerName(reader.GetString(0)); if (!ListOfServers.Contains(serverName)) { ListOfServers.Add(serverName); } } } // Schließt die MSSQL verbindung mssql.Close(); List <DirectoryItem> retList = new List <DirectoryItem>(); foreach (var serverName in ListOfServers) { //Erstellt ein neues DirectoryItem und fügt es der Liste hinzu retList.Add(new DirectoryItem { Id = -1, FullPath = $"\\\\{serverName}", Owner = "Kein Besitzer gefunden", Type = DirectoryItemType.Server, HasChildren = true }); } // Gibt eine Liste mit DirectoryItems zurück die die Server beinhaltet return(retList); }
/// <summary> /// Gibt eine Liste mit allen Unterordnern des übergebenen Pfades zurück /// </summary> /// <param name="fullPath">Der volle Pfad</param> /// <returns></returns> public static List <DirectoryItem> GetChildren(string fullPath) { // erstellt eine MSSQL Verbindung und öffnet Sie var mssql = new MsSql(); mssql.Open(); // Der SQL Befehl um alle Ordner abzurufen die mit dem Pfad beginnen string sql = $"SELECT * " + $"FROM {mssql.TBL_FS_Shares} " + $"WHERE _unc_path_name LIKE @fullPath " + $"ORDER BY _unc_path_name"; // Sendet den SQL Befehl an den SQL Server SqlCommand cmd = new SqlCommand(sql, mssql.Con); // Erstellt den vollen Pfad als Parameter cmd.Parameters.AddWithValue("fullPath", fullPath + "\\%"); // Erstellt eine leere Liste die später zurück gegeben werden kann List <DirectoryItem> retList = new List <DirectoryItem>(); // Benutzt den SQL Reader um über alle Zeilen der Abfrage zu gehen using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { // Erstellt ein neues DirectoryItem und fügt es der Liste hinzu retList.Add(new DirectoryItem { Id = (int)reader["_path_id"], FullPath = reader["_unc_path_name"].ToString(), Owner = reader["_owner_sid"].ToString(), Type = DirectoryItemType.SharedFolder, ParentID = -1, IsRoot = true, HasChildren = (bool)reader["_has_children"], Size = (long)reader["_size"], IsHidden = (bool)reader["_hidden"], ServerPath = reader["_path_name"].ToString(), DisplayName = reader["_display_name"].ToString(), Remark = reader["_remark"].ToString(), ShareType = reader["_share_type"].ToString() }); } } return(retList); }
/// <summary> /// Gibt eine Liste mit allen Unterordnern die die übergebene ID als ParentID besitzen /// </summary> /// <param name="Id">Die ParentID</param> /// <returns></returns> public static List <DirectoryItem> GetChildren(int Id) { // erstellt eine MSSQL Verbindung und öffnet Sie var mssql = new MsSql(); mssql.Open(); // Der SQL Befehl um alle Ordner abzurufen die die übergebene ParentID besitzen string sql = $"SELECT * " + $"FROM {mssql.TBL_FS_Dirs} " + $"WHERE _parent_path_id = @parentId " + $"ORDER BY _path_name"; // Sendet den SQL Befehl an den SQL Server SqlCommand cmd = new SqlCommand(sql, mssql.Con); // Erstellt die ParentId als Parameter cmd.Parameters.AddWithValue("parentId", Id); // Erstellt eine leere Liste die später zurück gegeben werden kann List <DirectoryItem> retList = new List <DirectoryItem>(); // Benutzt den SQL Reader um über alle Zeilen der Abfrage zu gehen using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { // Erstellt ein neues DirectoryItem und fügt es der Liste hinzu retList.Add(new DirectoryItem { Id = (int)reader["_path_id"], FullPath = reader["_path_name"].ToString(), Owner = reader["_owner_sid"].ToString(), Type = DirectoryItemType.Folder, ParentID = (int)reader["_parent_path_id"], IsRoot = (bool)reader["_is_root"], HasChildren = (bool)reader["_has_children"], ScanDeepth = (int)reader["_scan_deepth"], Size = (long)reader["_size"] }); } } // Schließt die MSSQL verbindung mssql.Close(); // Gibt die Liste zurück return(retList); }
/// <summary> /// Standard Konstruktor /// </summary> public UserAndOtherAccounts() { // erstellt und öffnet eine neue MsSql Verbindung mssql = new MsSql(); mssql.Open(); // Erzeugt eine neue Liste mit Einträgen Entrys = new List <CountEnrty>(); #region Benutzer // Erstelle Eintrag für Benutzer Entrys.Add(new CountEnrty { Name = "Benutzer", Count = GetCountUser().ToString() }); #endregion #region Benutzer (deaktiviert) // Erstelle Eintrag für deaktivierte Benutzer Entrys.Add(new CountEnrty { Name = "Benutzer (deaktiviert)", Count = GetCountDisabledUser().ToString() }); #endregion #region Administratoren // Erstellt die leere Liste in die die UserSID eingetragen werden sollen var admins = new List <string>(); // Schreibt alle User der Gruppe "Administratoren" in die Liste GetUserInGroup("S-1-5-32-544", ref admins); // Schreibt alle User der Gruppe "Domain-Admins" in die Liste GetUserInGroup("S-1-5-21-3723797570-695524079-4101376058-512", ref admins); // Löscht alle Duplikate aus der Liste admins = admins.Distinct().ToList(); // Erstelle Eintrag für Administratoren Entrys.Add(new CountEnrty { Name = "Admininstratoren", Count = admins.Count.ToString() }); #endregion #region Administratoren (deaktiviert) Entrys.Add(new CountEnrty { Name = "Admininstratoren (deaktiviert)", Count = GetCountDisabledAdmins(admins).ToString() }); #endregion // Schließt die MsSql Verbindung mssql.Close(); }
/// <summary> /// Gibt alle AD User zurück die in der Datenbank stehen /// </summary> /// <returns></returns> public static List <ADElement> GetAllADUsers(bool onlyEnabled = false) { // Erstellt leere Liste die mit den Rückgabewerten befüllt wird List <ADElement> retList = new List <ADElement>(); // erstellt eine MSSQL Verbindung und öffnet Sie var mssql = new MsSql(); mssql.Open(); // Der SQL Befehl um alle User abzurufen string sql = $"SELECT * " + $"FROM {mssql.TBL_AD_Users}"; if (onlyEnabled) { sql += $" WHERE Enabled = 1"; } // Sendet den SQL Befehl an den SQL Server SqlCommand cmd = new SqlCommand(sql, mssql.Con); // 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 string sid = reader["SID"].ToString(); 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"]); bool isAdmin = IsUserAdmin(sid); ADElementType type = (isAdmin) ? ADElementType.Administrator : ADElementType.User; retList.Add(new ADElement(sid, displayName, samAccountName, distinguishedName, userPrincipalName, enabled, type)); } } // Schließt die MSSQL verbindung mssql.Close(); return(retList); }
/// <summary> /// Fragt die Datenbank nach der übergebenen sid ab und gibt ein ADElement zurück /// </summary> /// <param name="sid"></param> /// <returns></returns> public static ADElement GetADUser(string sid) { // 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 * " + $"FROM {mssql.TBL_AD_Users} " + $"WHERE SID = @Sid"; // Sendet den SQL Befehl an den SQL Server SqlCommand cmd = new SqlCommand(sql, mssql.Con); //Parameter anhängen cmd.Parameters.AddWithValue("Sid", 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 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"]); bool isAdmin = IsUserAdmin(sid); ADElementType type = (isAdmin) ? ADElementType.Administrator : ADElementType.User; // Schließt die MSSQL verbindung mssql.Close(); return(new ADElement(sid, displayName, samAccountName, distinguishedName, userPrincipalName, enabled, type)); } } // Schließt die MSSQL verbindung mssql.Close(); return(null); }
/// <summary> /// Fragt die Datenbank nach der übergebenen sid ab und gibt ein ADElement zurück /// </summary> /// <param name="sid"></param> /// <returns></returns> public static ADElement GetADComputer(string sid) { // 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 * " + $"FROM {mssql.TBL_AD_Computers} " + $"WHERE SID = @Sid"; // Sendet den SQL Befehl an den SQL Server SqlCommand cmd = new SqlCommand(sql, mssql.Con); //Parameter anhängen cmd.Parameters.AddWithValue("Sid", 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 string name = reader["Name"].ToString(); string samAccountName = reader["SamAccountName"].ToString(); string distinguishedName = reader["DistinguishedName"].ToString(); string description = reader["Description"].ToString(); bool enabled = Convert.ToBoolean(reader["Enabled"]); DateTime lastLogon = Convert.ToDateTime(reader["LastLogon"]); DateTime lastPasswordSet = Convert.ToDateTime(reader["LastPasswordSet"]); // Schließt die MSSQL verbindung mssql.Close(); return(new ADElement(sid, name, samAccountName, distinguishedName, description, enabled, lastLogon, lastPasswordSet)); } } // Schließt die MSSQL verbindung mssql.Close(); return(null); }
/// <summary> /// Gibt den Usernamen und in Klammern dahinter den Pricipal zu eine übergebenen SID zurück /// </summary> /// <param name="sid">Die SID des Benutzers</param> /// <returns></returns> public static string GetUserNameAndPricipalName(string sid) { // 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 * FROM (" + $"SELECT SID, DisplayName name, UserPrincipalName secName FROM {mssql.TBL_AD_Users} " + $"UNION ALL " + $"SELECT SID, Name name, SamAccountName secName " + $"FROM {mssql.TBL_AD_Groups}) as UsersAndGroups " + $"WHERE SID = @Sid"; // Sendet den SQL Befehl an den SQL Server SqlCommand cmd = new SqlCommand(sql, mssql.Con); //Parameter anhängen cmd.Parameters.AddWithValue("Sid", sid); // Benutzt den SQL Reader um über alle Zeilen der Abfrage zu gehen using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { string name = reader["name"].ToString(); string secName = reader["secName"].ToString(); // Schließt die MSSQL verbindung mssql.Close(); return($"{name} ({secName})"); } } // Schließt die MSSQL verbindung mssql.Close(); return("Keinen Besitzer gefunden"); }
/// <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(); }
/// <summary> /// Gibt alle Gruppen eines Users zurück. Geht auch rekursiv in alle Gruppen in Gruppen. /// </summary> /// <param name="userSID"></param> /// <returns></returns> public static List <ADElement> GetGroupsFromUser(string userSID) { List <ADElement> retList = new List <ADElement>(); // erstellt eine MSSQL Verbindung und öffnet Sie var mssql = new MsSql(); mssql.Open(); // Der SQL Befehl um alle Gruppen eines string sql = $"SELECT g.* " + $"FROM ARPS.dbo.grp_user gu " + $"LEFT JOIN ARPS.dbo.adgroups g " + $"ON gu.grpSID = g.SID " + $"WHERE gu.userSID = @UserSID"; // Sendet den SQL Befehl an den SQL Server SqlCommand cmd = new SqlCommand(sql, mssql.Con); //Parameter anhängen cmd.Parameters.AddWithValue("@UserSID", userSID); // 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 string sid = reader["SID"].ToString(); string samAccountName = reader["SamAccountName"].ToString(); string distinguishedName = reader["DistinguishedName"].ToString(); string name = reader["Name"].ToString(); string description = reader["Description"].ToString(); bool isSecurityGroup = Convert.ToBoolean(reader["IsSecurityGroup"]); string gS = reader["GroupScope"].ToString(); GroupScope groupScope; switch (gS) { case "Global": groupScope = GroupScope.Global; break; case "Local": groupScope = GroupScope.Local; break; default: groupScope = GroupScope.Universal; break; } // Fügt die Gruppe zur Liste hinzu retList.Add(new ADElement(sid, name, samAccountName, distinguishedName, description, isSecurityGroup, groupScope)); // Ruft diese Funktion rekursiv auf und überprüft somit auch alle Gruppen in Gruppen retList.AddRange(GetGroupsFromUser(sid)); } } // Schließt die MSSQL verbindung mssql.Close(); return(retList); }
/// <summary> /// Gibt alle User einer Gruppe zurück. Geht auch rekursiv in alle Gruppen bis alle User aufgelöst sind /// </summary> /// <param name="grpSID">Die Gruppen SID von der man die User haben möchte</param> public static List <ADElement> GetUserInGroup(string grpSID) { List <ADElement> retList = new List <ADElement>(); // 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.dbo.adgroups g " + $"JOIN ARPS.dbo.grp_user gu " + $"ON g.SID = gu.grpSID " + $"LEFT JOIN ARPS.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", grpSID); // 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(GetUserInGroup(sid)); } 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 ADElement(sid, displayName, samAccountName, distinguishedName, userPrincipalName, enabled)); } } } } // Schließt die MSSQL verbindung mssql.Close(); return(retList); }
/// <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> /// Standard Konstruktor /// </summary> public Groups() { // erstellt und öffnet eine neue MsSql Verbindung mssql = new MsSql(); mssql.Open(); // Erzeugt eine neue Liste mit Einträgen Entrys = new List <CountEnrty>(); #region Alle Gruppen // Erstelle Eintrag für Gruppen Entrys.Add(new CountEnrty { Name = "Alle Gruppen", Count = GetCountGroups().ToString() }); #endregion #region Gruppen mit Mitgliedern (ohne Rekursionsgruppen) // Erstelle Eintrag für Gruppen mit Mitgliedern (ohne Rekursionsgruppen) Entrys.Add(new CountEnrty { Name = "Gruppen mit Mitgliedern (ohne Rekursionsgruppen)", Count = GetCountGroupsWithMembers().ToString() }); #endregion #region Leere Gruppen // Erstelle Eintrag für Gruppen die keine Mitglieder haben Entrys.Add(new CountEnrty { Name = "Leere Gruppen", Count = GetCountEmptyGroups().ToString() }); #endregion #region Gruppen in Rekursionen // Erstelle Eintrag für Gruppen die in Rekursion sind Entrys.Add(new CountEnrty { Name = "Gruppen in Rekursionen", Count = GetCountGroupsInRecursion().ToString() }); #endregion #region Die mitgliedstärksten Gruppen // Erstelle die Einträge für die drei mitgliedstärksten Gruppen List <string> biggestGroups = GetBiggestGroups(); Entrys.Add(new CountEnrty { Name = "Die mitgliedstärksten Gruppen", Count = biggestGroups.First() }); Entrys.Add(new CountEnrty { Name = "", Count = biggestGroups[1] }); Entrys.Add(new CountEnrty { Name = "", Count = biggestGroups[2] }); #endregion #region Globale Sicherheitsgruppen int globSecCount = GetCount($"SELECT count(*) " + $"FROM adgroups g " + $"WHERE g.IsSecurityGroup = 1 AND g.GroupScope = 'Global'"); Entrys.Add(new CountEnrty { Name = "Globale Sicherheitsgruppen", Count = globSecCount.ToString() }); #endregion #region Universelle Sicherheitsgruppen int univSecCount = GetCount($"SELECT count(*) " + $"FROM adgroups g " + $"WHERE g.IsSecurityGroup = 1 AND g.GroupScope = 'Universal'"); Entrys.Add(new CountEnrty { Name = "Universelle Sicherheitsgruppen", Count = univSecCount.ToString() }); #endregion #region Lokale Sicherheitsgruppen int localSecCount = GetCount($"SELECT count(*) " + $"FROM adgroups g " + $"WHERE g.IsSecurityGroup = 1 AND g.GroupScope = 'Local'"); Entrys.Add(new CountEnrty { Name = "Lokale Sicherheitsgruppen", Count = localSecCount.ToString() }); #endregion #region Globale Verteilergruppen int globVerCount = GetCount($"SELECT count(*) " + $"FROM adgroups g " + $"WHERE g.IsSecurityGroup = 0 AND g.GroupScope = 'Global'"); Entrys.Add(new CountEnrty { Name = "Globale Verteilergruppen", Count = globVerCount.ToString() }); #endregion #region Universelle Verteilergruppen int univVerCount = GetCount($"SELECT count(*) " + $"FROM adgroups g " + $"WHERE g.IsSecurityGroup = 0 AND g.GroupScope = 'Universal'"); Entrys.Add(new CountEnrty { Name = "Universelle Verteilergruppen", Count = univVerCount.ToString() }); #endregion #region Lokale Verteilergruppen int localVerCount = GetCount($"SELECT count(*) " + $"FROM adgroups g " + $"WHERE g.IsSecurityGroup = 0 AND g.GroupScope = 'Local'"); Entrys.Add(new CountEnrty { Name = "Lokale Verteilergruppen", Count = localVerCount.ToString() }); #endregion mssql.Close(); }
/// <summary> /// Gibt alle direkten ACEs des Ordners zurück /// </summary> /// <param name="_path_id">Die PfadId des Ordners</param> /// <returns></returns> public static List <DirectoryACE> GetACEs(int _path_id) { // 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 " + $"ug._is_group, ug._identity_name, ug._distinguished_name " + $", aces._ace_id, aces._sid, aces._rights, aces._type, aces._fsr, aces._is_inherited, aces._inheritance_flags, aces._propagation_flags " + $"FROM {mssql.TBL_FS_Dirs} dirs " + $"JOIN {mssql.TBL_FS_ACLs} acls " + $"ON dirs._path_id = acls._path_id " + $"JOIN {mssql.TBL_FS_ACEs} aces " + $"ON aces._ace_id = acls._ace_id " + $"JOIN( " + $"SELECT 0 as _is_group, SID _sid, DisplayName _identity_name, DistinguishedName _distinguished_name " + $"FROM {mssql.TBL_AD_Users} " + $"UNION ALL " + $"SELECT 1, SID, Name, DistinguishedName " + $"FROM {mssql.TBL_AD_Groups}) ug " + $"ON aces._sid = ug._sid " + $"WHERE dirs._path_id = @PathId"; // Sendet den SQL Befehl an den SQL Server SqlCommand cmd = new SqlCommand(sql, mssql.Con); //Parameter anhängen cmd.Parameters.AddWithValue("@PathId", _path_id); //Erstellt Liste die zurückgegeben wird List <DirectoryACE> aceList = new List <DirectoryACE>(); // Benutzt den SQL Reader um über alle Zeilen der Abfrage zu gehen using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { bool _is_group = Convert.ToBoolean(reader["_is_group"]); string _identity_name = reader["_identity_name"].ToString(); string _distinguished_name = reader["_distinguished_name"].ToString(); 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"]; aceList.Add( new DirectoryACE(_is_group, _identity_name, _distinguished_name, _ace_id, _sid, _rights, _type, _fsr, _is_inherited, _inheritance_flags, _propagation_flags)); } } // Schließt die MSSQL verbindung mssql.Close(); return(aceList); }
/// <summary> /// Gibt eine Liste mit allen Unterordnern des angegebenen Servers zurück die keine ParentId besitzen. /// </summary> /// <param name="serverName">Der Servername der abgefragt wird (zb "apollon")</param> /// <returns></returns> public static List <DirectoryItem> GetServerAndSharedFolders(string serverName) { // erstellt eine MSSQL Verbindung und öffnet Sie var mssql = new MsSql(); mssql.Open(); // Der SQL Befehl um alle Ordner abzurufen die mit dem "ServerName" beginnen aber keine ParentId besitzen string sql = $"SELECT ID, Directory, Owner " + $"FROM dirs " + $"WHERE ParentID IS NULL AND Directory LIKE @serverName " + $"ORDER BY Directory "; // Sendet den SQL Befehl an den SQL Server SqlCommand cmd = new SqlCommand(sql, mssql.Con); // Erstellt einen neuen Parameter mit dem Servernamen var serverNameParam = new SqlParameter("serverName", System.Data.SqlDbType.NVarChar) { Value = $"\\\\{serverName}\\%" }; // Bindet den Parameter an die Abfrage cmd.Parameters.Add(serverNameParam); // Erstellt eine leere Liste die später zurück gegeben werden kann List <DirectoryItem> retList = new List <DirectoryItem> { // Erstellt das Item für den Server new DirectoryItem { Id = -1, FullPath = $"\\\\{serverName}", Owner = "no Owner", Type = DirectoryItemType.Server } }; // Benutzt den SQL Reader um über alle Zeilen der Abfrage zu gehen using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { // Liest aus der jeweiligen Zeile die einzelnen Werte aus int id = reader.GetInt32(0); string dir = reader.GetString(1); string owner = reader.GetString(2); // Erstellt ein neues DirectoryItem und fügt es der Liste hinzu retList.Add(new DirectoryItem { Id = id, FullPath = dir, Owner = owner, Type = DirectoryItemType.SharedFolder }); } } // Schließt die MSSQL verbindung mssql.Close(); // Gibt die Liste zurück 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); }