예제 #1
0
        /// <summary>
        /// Ruft die ACEs der User ab und speichert sie
        /// </summary>
        public void FillAllAuthorizedUserACE()
        {
            //Prüft ob die ACEs schon gefüllt sind
            if (ACEs == null)
            {
                FillACEs();
            }

            AllAuthorizedACE        = new DirectoryACE("-");
            AllAuthorizedACE.Member = new List <DirectoryACE>(DirectoryStructure.GetAllAuthorizedUser(ACEs));

            List <DirectoryACE> AllAces = new List <DirectoryACE>();

            foreach (var ace in AllAuthorizedACE.Member)
            {
                AllAces.Add(ace);

                if (ace.Member != null)
                {
                    foreach (var ace2 in ace.Member)
                    {
                        AllAces.Add(ace2);

                        if (ace2.Member != null)
                        {
                            AllAces.AddRange(ace2.Member);
                        }
                    }
                }
            }

            var grpList = AllAces.GroupBy(u => u.SID).ToList();

            foreach (var ace in AllAuthorizedACE.Member)
            {
                IGrouping <string, DirectoryACE> match = grpList.FirstOrDefault(a => a.Key == ace.SID);
                ace.rightCount = match.Count();

                if (ace.Member != null)
                {
                    foreach (var ace2 in ace.Member)
                    {
                        IGrouping <string, DirectoryACE> match2 = grpList.FirstOrDefault(a => a.Key == ace2.SID);
                        ace2.rightCount = match2.Count();

                        if (ace2.Member != null)
                        {
                            foreach (var ace3 in ace2.Member)
                            {
                                IGrouping <string, DirectoryACE> match3 = grpList.FirstOrDefault(a => a.Key == ace3.SID);
                                ace3.rightCount = match3.Count();
                            }
                        }
                    }
                }
            }
        }
예제 #2
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);
                        }
                    }
                }
            }
        }
예제 #3
0
 public NTFSEntry(DirectoryACE ace)
 {
 }
예제 #4
0
        /// <summary>
        /// Hilfsfunktion die alle Member einer Gruppe ausliest. Falls Gruppen in Gruppen sind wir diese Funktion auch rekursiv aufgerufen
        /// </summary>
        /// <param name="groupAce">Das ACE der Gruppe die ausgelesen werden soll</param>
        /// <returns></returns>
        public static List <DirectoryACE> GetOnlyUserInGroup(DirectoryACE groupAce)
        {
            List <DirectoryACE> retList = new List <DirectoryACE>();

            // erstellt eine MSSQL Verbindung und öffnet Sie
            var mssql = new MsSql();

            mssql.Open();

            // Der SQL Befehl um alle Ordner abzurufen die root sind
            string sql = $"SELECT gu.userSID, CASE WHEN u.SID IS NULL THEN 1 ELSE 0 END as _is_group, u.* " +
                         $"FROM ARPS_Test.dbo.adgroups g " +
                         $"JOIN ARPS_Test.dbo.grp_user gu " +
                         $"ON g.SID = gu.grpSID " +
                         $"LEFT JOIN ARPS_Test.dbo.adusers u " +
                         $"ON u.SID = gu.userSID " +
                         $"WHERE g.SID = @GroupSid ";

            // Sendet den SQL Befehl an den SQL Server
            SqlCommand cmd = new SqlCommand(sql, mssql.Con);

            //Parameter anhängen
            cmd.Parameters.AddWithValue("@GroupSid", groupAce.SID);

            // Benutzt den SQL Reader um über alle Zeilen der Abfrage zu gehen
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    bool   isGroup = Convert.ToBoolean(reader["_is_group"]);
                    string sid     = reader["userSID"].ToString();

                    // Wenn die aktuelle Zeile eine Gruppe ist wird die Funktion Rekursiv aufgerufen
                    if (isGroup)
                    {
                        // Fügt die Rückgabewert der rekursiven Funktion an die Liste an
                        retList.AddRange(GetOnlyUserInGroup(new DirectoryACE(
                                                                sid,
                                                                groupAce.Rights,
                                                                groupAce.Type,
                                                                groupAce.FileSystemRight,
                                                                groupAce.IsInherited,
                                                                groupAce.InheritanceFlags,
                                                                groupAce.PropagationFlags)));
                    }
                    else
                    // Falls die Zeile ein User ist wir aus dem User ein PseudoACE erstellt und an die Liste angehängt
                    {
                        // Speichert die Daten des Readers in einzelne Variablen
                        string displayName       = reader["DisplayName"].ToString();
                        string samAccountName    = reader["SamAccountName"].ToString();
                        string distinguishedName = reader["DistinguishedName"].ToString();
                        string userPrincipalName = reader["UserPrincipalName"].ToString();
                        bool   enabled           = Convert.ToBoolean(reader["Enabled"]);

                        // erstellt den User falls er aktiv ist
                        if (enabled)
                        {
                            retList.Add(new DirectoryACE(
                                            false,
                                            displayName + " (" + userPrincipalName + ")",
                                            userPrincipalName,
                                            -1,
                                            sid,
                                            groupAce.Rights,
                                            groupAce.Type,
                                            groupAce.FileSystemRight,
                                            groupAce.IsInherited,
                                            groupAce.InheritanceFlags,
                                            groupAce.PropagationFlags));
                        }
                    }
                }
            }

            // Schließt die MSSQL verbindung
            mssql.Close();

            return(retList);
        }
예제 #5
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);
        }
예제 #6
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();
        }