Пример #1
0
        /// <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();
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        /// <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();
        }
Пример #7
0
        /// <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);
        }
Пример #8
0
        /// <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);
        }
Пример #9
0
        /// <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);
        }
Пример #10
0
        /// <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");
        }
Пример #11
0
        /// <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();
        }
Пример #12
0
        /// <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);
        }
Пример #13
0
        /// <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);
        }
Пример #14
0
        /// <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);
                        }
                    }
                }
            }
        }
Пример #15
0
        /// <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();
        }
Пример #16
0
        /// <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);
        }
Пример #17
0
        /// <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);
        }
Пример #18
0
        /// <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);
        }