示例#1
0
        /// <summary>
        /// Setzt den übergebenen HistoryLogEntry auf 'deleted' und schreibt das in die Datenbank
        /// </summary>
        /// <param name="HLE">Der übergebene HistoryLogEntry der aus der Tabelle kommt</param>
        private void RemoveHistoryLogEntry(HistoryLogEntry HLE)
        {
            // Erstellt eine Datenbankverbindung
            var mssql = new MsSql();

            // Öffnet die Datenbankverbindung
            mssql.Open();

            // Der Update SQL Befehl
            string sql = $"UPDATE schedule SET Status = 'deleted' WHERE ID = @id";

            SqlCommand cmd = new SqlCommand(sql, mssql.Con);

            // Hängt die ID als Parameter an
            cmd.Parameters.AddWithValue("@id", HLE.ID);

            // Führt die Query aus
            cmd.ExecuteNonQuery();

            // Schliest die Datenbankverbindung
            mssql.Close();

            // Lädt die HistoryLogs neu
            AsyncLoadedHistoryLog(100);
        }
示例#2
0
        /// <summary>
        /// Liest alle Gruppen aus der Datenbank aus und speichert sie in der Datenbank
        /// </summary>
        static void GetAllADGroups()
        {
            MsSql mssql = new MsSql();

            mssql.Open();

            // create your domain context
            PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

            GroupPrincipal qbeGrp = new GroupPrincipal(ctx);

            // create your principal searcher passing in the QBE principal
            PrincipalSearcher srch = new PrincipalSearcher(qbeGrp);

            // find all matches
            foreach (var found in srch.FindAll())
            {
                if (found is GroupPrincipal grp)
                {
                    int isSecurityGroup = (bool)grp.IsSecurityGroup ? 1 : 0;

                    string grpDesc = (string.IsNullOrEmpty(grp.Description)) ? null : grp.Description.Replace("'", "`");

                    string sql = $"IF NOT EXISTS (SELECT * FROM {MsSql.TBL_tmp_AD_Groups} WHERE SID = '{grp.Sid}') " +
                                 $"INSERT INTO {MsSql.TBL_tmp_AD_Groups}(SID, SamAccountName, DistinguishedName, Name, Description, IsSecurityGroup, GroupScope) " +
                                 $"VALUES ('{grp.Sid}', " +
                                 $"'{grp.SamAccountName}', " +
                                 $"'{grp.DistinguishedName}', " +
                                 $"'{grp.Name}', " +
                                 $"'{grpDesc}', " +
                                 $"'{isSecurityGroup}', " +
                                 $"'{grp.GroupScope}') " +
                                 $"ELSE " +
                                 $"UPDATE {MsSql.TBL_tmp_AD_Groups} " +
                                 $"SET SamAccountName = '{grp.SamAccountName}', " +
                                 $"DistinguishedName = '{grp.DistinguishedName}', " +
                                 $"Name = '{grp.Name}', " +
                                 $"Description = '{grpDesc}', " +
                                 $"IsSecurityGroup = '{isSecurityGroup}', " +
                                 $"GroupScope = '{grp.GroupScope}'" +
                                 $"WHERE SID = '{grp.Sid}'";

                    SqlCommand cmd = new SqlCommand(sql, mssql.Con);
                    cmd.ExecuteNonQuery();

                    // fill the Table grp_user with the users in this group
                    GetAllUserInGroups(mssql.Con, grp);
                }
            }

            mssql.Close();
        }
示例#3
0
        /// <summary>
        /// Holt sich alle Einträge aus der Datenbank und speichert sie in der Liste "HistoryLog"
        /// </summary>
        /// <param name="showCount">Wie viele Einträge sollen angezeigt werden</param>
        /// <returns></returns>
        private Task GetPlanFromMSSQL(int showCount)
        {
            return(Task.Factory.StartNew(() =>
            {
                var mssql = new MsSql();
                mssql.Open();

                string sql = $"SELECT TOP(@showcount) * FROM schedule";
                SqlCommand cmd = new SqlCommand(sql, mssql.Con);

                cmd.Parameters.AddWithValue("@showcount", showCount);

                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    // Beim auslesen der Liste wird erst eine leere Liste erstellt
                    HistoryLog = new ObservableCollection <HistoryLogEntry>();

                    while (reader.Read())
                    {
                        var endDate = ((DateTime)reader["EndDate"]).ToShortDateString();

                        HistoryLog.Insert(0, new HistoryLogEntry
                        {
                            ID = (int)reader["ID"],
                            Username = reader["Username"].ToString(),
                            UserSid = reader["UserSid"].ToString(),
                            Groupname = reader["Groupname"].ToString(),
                            GroupSid = reader["GroupSid"].ToString(),
                            StartDate = ((DateTime)reader["StartDate"]).ToShortDateString(),
                            //EndDate = ((DateTime)reader["EndDate"]).ToShortDateString(),
                            EndDate = (endDate == DateTime.MaxValue.ToShortDateString()) ? "∞" : endDate,
                            Status = reader["Status"].ToString(),
                            Creator = reader["Creator"].ToString(),
                            Comment = reader["Comment"].ToString()
                        });
                    }
                }

                mssql.Close();
            }));
        }
示例#4
0
        /// <summary>
        /// Liest alle Computer aus dem Ad uns spiecht diese in der Datenbank
        /// </summary>
        static void GetAllADComputer()
        {
            MsSql mssql = new MsSql();

            mssql.Open();

            // create your domain context
            ComputerPrincipal ctx = new ComputerPrincipal(new PrincipalContext(ContextType.Domain));

            // create your principal searcher passing in the QBE principal
            PrincipalSearcher srch = new PrincipalSearcher(ctx);

            // find all matches
            foreach (var found in srch.FindAll())
            {
                if (found is ComputerPrincipal computer)
                {
                    int    enabled = (bool)computer.Enabled ? 1 : 0;
                    string sql     = $"IF NOT EXISTS (SELECT * FROM {MsSql.TBL_tmp_AD_Computers} WHERE SID = '{computer.Sid}') " +
                                     $"INSERT INTO {MsSql.TBL_tmp_AD_Computers}(SID, SamAccountName, Name, DistinguishedName, DisplayName, Description, Enabled, LastLogon, LastPasswordSet) " +
                                     $"VALUES ('{computer.Sid}', '{computer.SamAccountName}', '{computer.Name}', '{computer.DistinguishedName}', '{computer.DisplayName}', " +
                                     $"'{computer.Description}', '{enabled}', '{computer.LastLogon}', '{computer.LastPasswordSet}') " +
                                     $"ELSE " +
                                     $"UPDATE {MsSql.TBL_tmp_AD_Computers} " +
                                     $"SET SamAccountName = '{computer.SamAccountName}'," +
                                     $"Name = '{computer.Name}'," +
                                     $"DistinguishedName = '{computer.DistinguishedName}'," +
                                     $"DisplayName = '{computer.DisplayName}'," +
                                     $"Description = '{computer.Description}'," +
                                     $"Enabled = '{enabled}'," +
                                     $"LastLogon = '{computer.LastLogon}'," +
                                     $"LastPasswordSet = '{computer.LastPasswordSet}'" +
                                     $"WHERE SID = '{computer.Sid}'";

                    SqlCommand cmd = new SqlCommand(sql, mssql.Con);
                    cmd.ExecuteNonQuery();
                }
            }

            mssql.Close();
        }
示例#5
0
        /// <summary>
        /// Liest alle User aus dem Ad und speicht sie in der Datenbank
        /// </summary>
        static void GetAllADUsers()
        {
            MsSql mssql = new MsSql();

            mssql.Open();

            // create your domain context
            PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

            // define a "query-by-example" principal - here, we search for a UserPrincipal
            UserPrincipal qbeUser = new UserPrincipal(ctx);

            // create your principal searcher passing in the QBE principal
            PrincipalSearcher srch = new PrincipalSearcher(qbeUser);

            // find all matches
            foreach (var found in srch.FindAll())
            {
                if (found is UserPrincipal user)
                {
                    int    enabled = (bool)user.Enabled ? 1 : 0;
                    string sql     = $"IF NOT EXISTS (SELECT * FROM {MsSql.TBL_tmp_AD_Users} WHERE SID = '{user.Sid}') " +
                                     $"INSERT INTO {MsSql.TBL_tmp_AD_Users}(SID, DisplayName, SamAccountName, DistinguishedName, UserPrincipalName, Enabled) " +
                                     $"VALUES ('{user.Sid}', '{user.DisplayName}', '{user.SamAccountName}', '{user.DistinguishedName}', '{user.UserPrincipalName}', '{enabled}') " +
                                     $"ELSE " +
                                     $"UPDATE {MsSql.TBL_tmp_AD_Users} " +
                                     $"SET DisplayName = '{user.DisplayName}'," +
                                     $"SamAccountName = '{user.SamAccountName}'," +
                                     $"DistinguishedName = '{user.DistinguishedName}'," +
                                     $"UserPrincipalName = '{user.UserPrincipalName}'," +
                                     $"Enabled = '{enabled}'" +
                                     $"WHERE SID = '{user.Sid}'";

                    SqlCommand cmd = new SqlCommand(sql, mssql.Con);
                    cmd.ExecuteNonQuery();
                }
            }

            mssql.Close();
        }
示例#6
0
        /// <summary>
        /// Schreibt für jede geplannte Gruppe einen Datensatz in die Datenbank
        /// </summary>
        private void PlannedScheduleToMSSQL()
        {
            // Erstellt eine Datenbankverbindung
            var mssql = new MsSql();

            // Öffnet die Datenbankverbindung
            mssql.Open();

            // Schleife über alle Gruppen der geplanten Gruppen
            foreach (var group in PlannedGroups)
            {
                // Der Insert SQL Befehl
                string sql = $"INSERT INTO schedule (Username, UserSid, Groupname, GroupSid, StartDate, EndDate, Creator, Comment, Status) " +
                             $"VALUES (@username, @usersid, @groupname, @groupsid, @startdate, @enddate, @creator, @comment, @status)";

                SqlCommand cmd = new SqlCommand(sql, mssql.Con);

                // Hängt alle SpaltenValues per Parameter an
                cmd.Parameters.AddWithValue("@username", SelectedUser.Name.ToString());
                cmd.Parameters.AddWithValue("@usersid", SelectedUser.Sid.ToString());
                cmd.Parameters.AddWithValue("@startdate", StartDate);
                cmd.Parameters.AddWithValue("@enddate", EndDate);
                cmd.Parameters.AddWithValue("@creator", EditorInitials);
                cmd.Parameters.AddWithValue("@comment", Comment);
                cmd.Parameters.AddWithValue("@status", "planned");
                cmd.Parameters.AddWithValue("@groupname", group.Name.ToString());
                cmd.Parameters.AddWithValue("@groupsid", group.Sid.ToString());

                // Führt die Query aus
                cmd.ExecuteNonQuery();
            }

            // Schliest die Datenbankverbindung
            mssql.Close();

            // Lädt die HistoryLogs neu
            AsyncLoadedHistoryLog(100);
        }
示例#7
0
        /// <summary>
        /// Führt ein Update auf der Datenbank aus und ändert den Status und den Completed Wert
        /// </summary>
        /// <param name="id">Die ID des Datensatzes der geändert werden soll</param>
        /// <param name="status">Der neue Status der gesetzt wird</param>
        /// <param name="completed">Ob der Plan abgeschlossen ist oder nicht</param>
        private static void SetNewStatus(int id, string status, bool completed)
        {
            // Erstellt eine Datenbankverbindung
            var mssql = new MsSql();

            // Öffnet die Datenbankverbindung
            mssql.Open();

            // Der Update SQL Befehl
            string sql = $"UPDATE schedule SET Status = @status, Completed = @completed WHERE ID = @id";

            SqlCommand cmd = new SqlCommand(sql, mssql.Con);

            // Hängt die Parameter an
            cmd.Parameters.AddWithValue("@id", id);
            cmd.Parameters.AddWithValue("@completed", (completed) ? 1 : 0);
            cmd.Parameters.AddWithValue("@status", status);

            // Führt die Query aus
            cmd.ExecuteNonQuery();

            // Schliest die Datenbankverbindung
            mssql.Close();
        }
示例#8
0
 public static void CloseConnection(MsSql msSql)
 {
     msSql.Close();
     msSql.Dispose();
 }
示例#9
0
        /// <summary>
        /// Liest die ACEs des übergebenen Ordners durch und schreib diese in die beiden Datenbanken aces und acls
        /// </summary>
        /// <param name="dSecurity">Das DirecrotySecurity Objekt des Ordners</param>
        /// <param name="_path_id">Die ID des Ordnerelements aus der dirs Datenbank</param>
        /// <param name="_acltype">Der Type aus dem diese ACL kommt. (0 = normales Verzeichnis, 1 = Freigabe)</param>
        static void GetACEs(DirectorySecurity dSecurity, int _path_id, int _acl_type = 0)
        {
            AuthorizationRuleCollection acl = dSecurity.GetAccessRules(true, true, typeof(SecurityIdentifier)); // FÜR SID
            //AuthorizationRuleCollection acl = dSecurity.GetAccessRules(true, true, typeof(NTAccount));        // FÜR NAMEN (ARGES/walzenbach)

            //baut eine SQL Verbindung auf
            MsSql mssql = new MsSql();

            //mssql.Open();

            foreach (FileSystemAccessRule ace in acl)
            {
                //if (dirId == -1)
                //    return;

                //Liest die einzelnen Values aus dem ACE aus
                string _sid               = ace.IdentityReference.Value;
                string _fsr               = ace.FileSystemRights.ToString();
                int    _rights            = (int)ace.FileSystemRights;
                int    _type              = (int)ace.AccessControlType;
                int    _is_inherited      = ace.IsInherited ? 1 : 0;
                int    _inheritance_flags = (int)ace.InheritanceFlags;
                int    _propagation_flags = (int)ace.PropagationFlags;
                string _ace_hash          = Helper.Hash(_sid + _rights + _type + _is_inherited + _inheritance_flags + _propagation_flags);


                #region Prüfung ob schon vorhanden ist
                // Der SQL Befehl zum überprüfen ob der jeweilige Eintrag schon vorhanden ist
                string     sql = $"SELECT _ace_id FROM {MsSql.TBL_tmp_FS_ACEs} WHERE _ace_hash = @AceHash";
                SqlCommand cmd = new SqlCommand(sql, mssql.Con);
                // Der Hash wird als Parameter an den SQL Befehl gehängt
                cmd.Parameters.AddWithValue("@AceHash", _ace_hash);

                // Öffnet die SQL Verbindung, führt die Abfrage durch und schließt die Verbindung wieder
                mssql.Open();
                // Falls es den abgefragten Datensatz schon gibt, bekommt man in index die ID des Datensatzen, sonnst null
                var _ace_id = cmd.ExecuteScalar();
                mssql.Close();
                #endregion


                // ACE Hash ist noch nicht vorhanden
                if (_ace_id == null)
                {
                    // Der SQL Befehl zum INSERT in die Datenbank
                    sql = $"INSERT INTO {MsSql.TBL_tmp_FS_ACEs}(_sid, _fsr, _rights, _type, _is_inherited, _inheritance_flags, _propagation_flags, _ace_hash) " +
                          $"OUTPUT INSERTED._ace_id " +
                          $"VALUES (@Sid, @Fsr, @Rights, @Type, @IsInherited, @InheritanceFlags, @PropagationFlags, @AceHash) ";

                    cmd = new SqlCommand(sql, mssql.Con);

                    // Hängt die Parameter an
                    cmd.Parameters.AddWithValue("@Sid", _sid);
                    cmd.Parameters.AddWithValue("@Fsr", _fsr);
                    cmd.Parameters.AddWithValue("@Rights", _rights);
                    cmd.Parameters.AddWithValue("@Type", _type);
                    cmd.Parameters.AddWithValue("@IsInherited", _is_inherited);
                    cmd.Parameters.AddWithValue("@InheritanceFlags", _inheritance_flags);
                    cmd.Parameters.AddWithValue("@PropagationFlags", _propagation_flags);
                    cmd.Parameters.AddWithValue("@AceHash", _ace_hash);

                    // Öffnet die SQL Verbindung
                    mssql.Open();
                    // Führt die Query aus
                    _ace_id = (int)cmd.ExecuteScalar();

                    //Schließt die Verbindung
                    mssql.Close();
                }
                // Hash ist noch nicht vorhanden
                else
                {
                    // SQL Befehl zum Updaten des Eintrags
                    sql = $"UPDATE {MsSql.TBL_tmp_FS_ACEs} " +
                          $"SET _sid = @Sid, _fsr = @Fsr, _rights = @Rights, _type = @Type, _is_inherited = @IsInherited, " +
                          $"_inheritance_flags = @InheritanceFlags, _propagation_flags = @PropagationFlags, _ace_hash = @AceHash " +
                          $"WHERE _ace_id = @AceId";

                    cmd = new SqlCommand(sql, mssql.Con);

                    // Hängt die Parameter an
                    cmd.Parameters.AddWithValue("@Sid", _sid);
                    cmd.Parameters.AddWithValue("@Fsr", _fsr);
                    cmd.Parameters.AddWithValue("@Rights", _rights);
                    cmd.Parameters.AddWithValue("@Type", _type);
                    cmd.Parameters.AddWithValue("@IsInherited", _is_inherited);
                    cmd.Parameters.AddWithValue("@InheritanceFlags", _inheritance_flags);
                    cmd.Parameters.AddWithValue("@PropagationFlags", _propagation_flags);
                    cmd.Parameters.AddWithValue("@AceHash", _ace_hash);
                    cmd.Parameters.AddWithValue("@AceId", (int)_ace_id);

                    // Öffnet die SQL Verbindung
                    mssql.Open();
                    // Führt die Query aus
                    cmd.ExecuteNonQuery();
                    //Schließt die Verbindung
                    mssql.Close();
                }


                #region Eintragung in die ACL Datenbank
                sql = $"INSERT INTO {MsSql.TBL_tmp_FS_ACLs} (_path_id, _ace_id, _type) SELECT @PathId, @AceId, @AclType " +
                      $"WHERE NOT EXISTS(SELECT * FROM {MsSql.TBL_tmp_FS_ACLs} WHERE _path_id = @PathId AND _ace_id = @AceId AND _type = @AclType)";

                cmd = new SqlCommand(sql, mssql.Con);

                // Die Ids werden als Parameter an den SQL Befehl gehängt
                cmd.Parameters.AddWithValue("@PathId", _path_id);
                cmd.Parameters.AddWithValue("@AceId", _ace_id);
                cmd.Parameters.AddWithValue("@AclType", _acl_type);

                // Öffnet die SQL Verbindung, führt die Abfrage durch und schließt die Verbindung wieder
                mssql.Open();
                cmd.ExecuteNonQuery();
                mssql.Close();
                #endregion
            }
        }
示例#10
0
        /// <summary>
        /// Liest den jeweiligen Ordner und rekursive alle Unterordner ab und speichert die Informationen in der Datenbank
        /// </summary>
        /// <param name="dInfo">Das DirectoryInfo Object des Ordners der verarbeitet werden soll</param>
        /// <param name="parentId">Die ID des übergeortneten Ordners</param>
        public static void GetDirectorySecurity(DirectoryInfo dInfo, int parentId)
        {
            if (dInfo == null)
            {
                return;
            }

            //baut eine SQL Verbindung auf
            MsSql mssql = new MsSql();
            //mssql.Open();

            // Der volle Pfad
            string _path_name = dInfo.FullName;
            // Die ID des übergeordneten Ordners
            int _parent_path_id = parentId;
            // Berechnet den Hash und speichert ihn
            string _path_hash = Helper.Hash(_path_name);
            // Ob der Ordner in der ersten Ebene ist oder nicht
            int _is_root = (_parent_path_id == -1) ? 1 : 0;

            // Die Ebene des Ordners
            int _scan_deepth = _path_name.TrimStart('\\').Split('\\').Count() - 1;


            //Ausgabe: Alle Pafde bis zur 3.Ebene werden ausgegeben
            //Index++;
            //if (_scan_deepth <= 5)
            //{
            //    //Console.WriteLine(_path_name);
            //    float percent = (float)Index / (float)Count * 100f;
            //    Console.WriteLine(percent.ToString("n2") + $" % of {Count} -- {_path_name}");
            //}



            #region Prüfung ob schon vorhanden ist
            // Der SQL Befehl zum überprüfen ob der jeweilige Eintrag schon vorhanden ist
            string     sql = $"SELECT _path_id FROM {MsSql.TBL_tmp_FS_Dirs} WHERE _path_hash = @PathHash";
            SqlCommand cmd = new SqlCommand(sql, mssql.Con);
            // Der Hash wird als Parameter an den SQL Befehl gehängt
            cmd.Parameters.AddWithValue("@PathHash", _path_hash);

            // Öffnet die SQL Verbindung, führt die Abfrage durch und schließt die Verbindung wieder
            mssql.Open();
            // Falls es den abgefragten Datensatz schon gibt, bekommt man in index die ID des Datensatzen, sonnst null
            var _path_id = cmd.ExecuteScalar();
            mssql.Close();
            #endregion

            #region Größenberechnung

            // Es gibt die Zeile
            long _size = 0;
            //if (_path_id != null)
            //{
            //    sql = $"SELECT _size FROM {MsSql.TBL_tmp_FS_Dirs} WHERE _path_id = @PathId";
            //    cmd = new SqlCommand(sql, mssql.Con);
            //    // Der Hash wird als Parameter an den SQL Befehl gehängt
            //    cmd.Parameters.AddWithValue("@PathId", _path_id);

            //    // Öffnet die SQL Verbindung, führt die Abfrage durch und schließt die Verbindung wieder
            //    mssql.Open();
            //    // Falls es den abgefragten Datensatz schon gibt, bekommt man in index die ID des Datensatzen, sonnst null
            //    var size = cmd.ExecuteScalar();
            //    mssql.Close();

            //    if ((long)size == 0 || size == null)
            //        _size = DirSize(dInfo);
            //    else
            //        _size = (long)size;
            //}
            //else
            //{
            //    _size = DirSize(dInfo);
            //}
            #endregion

            // Liest alle Unterordner in ein Array
            DirectoryInfo[] childs;
            try
            {
                childs = dInfo.GetDirectories();
            }
            catch (Exception)
            {
                childs = new DirectoryInfo[1];
            }

            // Liest die Infos über den Besitzer aus
            string            _owner_sid = "0";
            DirectorySecurity dSecurity  = null;
            try
            {
                dSecurity = dInfo.GetAccessControl();
                IdentityReference owner = dSecurity.GetOwner(typeof(SecurityIdentifier));  // FÜR SID
                _owner_sid = owner.Value;
            }
            catch (Exception) { }

            // Ob der Ordner Unterordner hat oder nicht
            int _has_children = (childs.Length > 0) ? 1 : 0;

            //Hash ist noch nicht vorhanden
            if (_path_id == null)
            {
                // Der SQL Befehl zum INSERT in die Datenbank
                sql = $"INSERT INTO {MsSql.TBL_tmp_FS_Dirs}(_path_name, _owner_sid, _path_hash, _parent_path_id, _is_root, _has_children, _scan_deepth, _size) " +
                      $"OUTPUT INSERTED._path_id " +
                      $"VALUES (@PathName, @OwnerSid, @PathHash, @ParentPathId, @IsRoot, @HasChildren, @ScanDeepth, @Size) ";

                cmd = new SqlCommand(sql, mssql.Con);

                // Hängt die Parameter an
                cmd.Parameters.AddWithValue("@PathName", _path_name);
                cmd.Parameters.AddWithValue("@OwnerSid", _owner_sid);
                cmd.Parameters.AddWithValue("@PathHash", _path_hash);
                cmd.Parameters.AddWithValue("@ParentPathId", _parent_path_id);
                cmd.Parameters.AddWithValue("@IsRoot", _is_root);
                cmd.Parameters.AddWithValue("@HasChildren", _has_children);
                cmd.Parameters.AddWithValue("@ScanDeepth", _scan_deepth);
                cmd.Parameters.AddWithValue("@Size", _size);

                // Öffnet die SQL Verbindung
                mssql.Open();
                // Führt die Query aus
                _path_id = (int)cmd.ExecuteScalar();
                //Schließt die Verbindung
                mssql.Close();
            }
            // Hash ist noch nicht vorhanden
            else
            {
                // SQL Befehl zum Updaten des Eintrags
                sql = $"UPDATE {MsSql.TBL_tmp_FS_Dirs} " +
                      $"SET _path_name = @PathName, _owner_sid = @OwnerSid, _path_hash = @PathHash, _parent_path_id = @ParentPathId, " +
                      $"_is_root = @IsRoot, _has_children = @HasChildren, _scan_deepth = @ScanDeepth, _size = @Size " +
                      $"WHERE _path_id = @PathId";

                cmd = new SqlCommand(sql, mssql.Con);

                // Hängt die Parameter an
                cmd.Parameters.AddWithValue("@PathName", _path_name);
                cmd.Parameters.AddWithValue("@OwnerSid", _owner_sid);
                cmd.Parameters.AddWithValue("@PathHash", _path_hash);
                cmd.Parameters.AddWithValue("@ParentPathId", _parent_path_id);
                cmd.Parameters.AddWithValue("@IsRoot", _is_root);
                cmd.Parameters.AddWithValue("@HasChildren", _has_children);
                cmd.Parameters.AddWithValue("@ScanDeepth", _scan_deepth);
                cmd.Parameters.AddWithValue("@Size", _size);
                cmd.Parameters.AddWithValue("@PathId", (int)_path_id);

                // Öffnet die SQL Verbindung
                mssql.Open();
                // Führt die Query aus
                cmd.ExecuteNonQuery();
                //Schließt die Verbindung
                mssql.Close();
            }

            // Ruft die ACL zum jeweiligen Ordner ab und schreib diese in die Datenbank
            if (dSecurity != null)
            {
                GetACEs(dSecurity, (int)_path_id);
            }

            // Geht über alle Unterordner (Kinder) und ruft die Funktion rekursiv auf
            foreach (DirectoryInfo child in childs)
            {
                GetDirectorySecurity(child, (int)_path_id);
            }
        }
示例#11
0
        /// <summary>
        /// Liest die Ordnerinfos der freigegebenen Ordner aus und speichert diese in der Datenbank
        /// </summary>
        /// <param name="share">Das Share Element der Freigabe</param>
        /// <param name="displayname">Der Name als die der Server angezeigt werden soll</param>
        internal static void GetSharesSecurity(Share share, string displayname)
        {
            if (share.NetName != "Install")
            {
                return;
            }
            DirectoryInfo dInfo = new DirectoryInfo(share.ToString());

            if (dInfo == null)
            {
                return;
            }

            //baut eine SQL Verbindung auf
            MsSql mssql = new MsSql();

            mssql.Open();

            // Der volle Pfad (UNC Pfad)
            string _unc_path_name = dInfo.FullName;
            // Der Pfad auf dem lokalen System (z.b: x:\\Install
            string _path_name = share.Path;
            // Berechnet den Hash und speichert ihn
            string _path_hash = Helper.Hash(_unc_path_name);
            // Der Name der in ARPS angezeigt werden soll
            string _display_name = displayname;
            // Die Beschreibung der Freigabe
            string _remark = share.Remark;
            // Der ShareType
            ShareType _share_type = share.ShareType;
            // Ob es eine versteckte Freigabe ist oder nicht
            bool _hidden = CheckIsShareHidden(share);

            Console.WriteLine("Share: " + share + " - " + share.Remark);

            #region Prüfung ob schon vorhanden ist
            // Der SQL Befehl zum überprüfen ob der jeweilige Eintrag schon vorhanden ist
            string     sql = $"SELECT _path_id FROM {MsSql.TBL_tmp_FS_Shares} WHERE _path_hash = @PathHash";
            SqlCommand cmd = new SqlCommand(sql, mssql.Con);
            // Der Hash wird als Parameter an den SQL Befehl gehängt
            cmd.Parameters.AddWithValue("@PathHash", _path_hash);

            // Öffnet die SQL Verbindung, führt die Abfrage durch und schließt die Verbindung wieder
            mssql.Open();
            // Falls es den abgefragten Datensatz schon gibt, bekommt man in index die ID des Datensatzen, sonnst null
            var _path_id = cmd.ExecuteScalar();
            mssql.Close();
            #endregion

            #region Größenberechnung

            // Es gibt die Zeile
            long _size;
            if (_path_id != null)
            {
                sql = $"SELECT _size FROM {MsSql.TBL_tmp_FS_Shares} WHERE _path_id = @PathId";
                cmd = new SqlCommand(sql, mssql.Con);
                // Der Hash wird als Parameter an den SQL Befehl gehängt
                cmd.Parameters.AddWithValue("@PathId", _path_id);

                // Öffnet die SQL Verbindung, führt die Abfrage durch und schließt die Verbindung wieder
                mssql.Open();
                // Falls es den abgefragten Datensatz schon gibt, bekommt man in index die ID des Datensatzen, sonnst null
                var size = cmd.ExecuteScalar();
                mssql.Close();

                if ((long)size == 0 || size == null)
                {
                    _size = DirSize(dInfo);
                }
                else
                {
                    _size = (long)size;
                }
            }
            else
            {
                _size = DirSize(dInfo);
            }
            #endregion

            // Liest alle Unterordner in ein Array
            DirectoryInfo[] childs;
            try
            {
                childs = dInfo.GetDirectories();
            }
            catch (Exception)
            {
                childs = new DirectoryInfo[1];
            }

            // Liest die Infos über den Besitzer aus
            string            _owner_sid = "0";
            DirectorySecurity dSecurity  = null;
            try
            {
                dSecurity = dInfo.GetAccessControl();
                IdentityReference owner = dSecurity.GetOwner(typeof(SecurityIdentifier));  // FÜR SID
                _owner_sid = owner.Value;
            }
            catch (Exception) { }

            // Ob der Ordner Unterordner hat oder nicht
            int _has_children = (childs.Length > 0) ? 1 : 0;

            // Hash ist noch nicht vorhanden
            if (_path_id == null)
            {
                // Der SQL Befehl zum INSERT in die Datenbank
                sql = $"INSERT INTO {MsSql.TBL_tmp_FS_Shares}(_unc_path_name, _owner_sid, _has_children, _size, _path_hash, _path_name, _display_name, _remark, _share_type, _hidden) " +
                      $"OUTPUT INSERTED._path_id " +
                      $"VALUES (@UncPathName, @OwnerSid, @HasChildren, @Size, @PathHash, @PathName, @DisplayName, @Remark, @ShareType, @Hidden) ";

                cmd = new SqlCommand(sql, mssql.Con);

                // Hängt die Parameter an
                cmd.Parameters.AddWithValue("@UncPathName", _unc_path_name);
                cmd.Parameters.AddWithValue("@OwnerSid", _owner_sid);
                cmd.Parameters.AddWithValue("@HasChildren", _has_children);
                cmd.Parameters.AddWithValue("@Size", _size);
                cmd.Parameters.AddWithValue("@PathHash", _path_hash);
                cmd.Parameters.AddWithValue("@PathName", _path_name);
                cmd.Parameters.AddWithValue("@DisplayName", _display_name);
                cmd.Parameters.AddWithValue("@Remark", _remark);
                cmd.Parameters.AddWithValue("@ShareType", _share_type.ToString());
                cmd.Parameters.AddWithValue("@Hidden", _hidden);

                // Öffnet die SQL Verbindung
                mssql.Open();
                // Führt die Query aus
                _path_id = (int)cmd.ExecuteScalar();
                //Schließt die Verbindung
                mssql.Close();
            }
            // Hash ist noch nicht vorhanden
            else
            {
                // SQL Befehl zum Updaten des Eintrags
                sql = $"UPDATE {MsSql.TBL_tmp_FS_Shares} " +
                      $"SET _unc_path_name = @UncPathName, _owner_sid = @OwnerSid, _has_children = @HasChildren, _size = @Size, _path_hash = @PathHash, " +
                      $"_path_name = @PathName, _display_name = @DisplayName, _remark = @Remark, _share_type = @ShareType, _hidden = @Hidden " +
                      $"WHERE _path_id = @PathId";

                cmd = new SqlCommand(sql, mssql.Con);

                // Hängt die Parameter an
                cmd.Parameters.AddWithValue("@UncPathName", _unc_path_name);
                cmd.Parameters.AddWithValue("@OwnerSid", _owner_sid);
                cmd.Parameters.AddWithValue("@HasChildren", _has_children);
                cmd.Parameters.AddWithValue("@Size", _size);
                cmd.Parameters.AddWithValue("@PathHash", _path_hash);
                cmd.Parameters.AddWithValue("@PathName", _path_name);
                cmd.Parameters.AddWithValue("@DisplayName", _display_name);
                cmd.Parameters.AddWithValue("@Remark", _remark);
                cmd.Parameters.AddWithValue("@ShareType", _share_type);
                cmd.Parameters.AddWithValue("@Hidden", _hidden);
                cmd.Parameters.AddWithValue("@PathId", (int)_path_id);

                // Öffnet die SQL Verbindung
                mssql.Open();
                // Führt die Query aus
                cmd.ExecuteNonQuery();
                //Schließt die Verbindung
                mssql.Close();
            }

            // Ruft die ACL zum jeweiligen Ordner ab und schreib diese in die Datenbank
            if (dSecurity != null)
            {
                GetACEs(dSecurity, (int)_path_id, 1);
            }

            // Geht über alle Unterordner (Kinder) und ruft die Funktion rekursiv auf
            foreach (DirectoryInfo child in childs)
            {
                GetDirectorySecurity(child, (int)_path_id);
            }
        }
示例#12
0
        /// <summary>
        /// Arbeitet alle noch nicht fetiggestellten Mitgliedschaften ab
        /// </summary>
        private static void WorkScheduleFromDB()
        {
            // Erstellt und öffnet die SQL Verbindung
            MsSql mssql = new MsSql();

            mssql.Open();

            // Der SQL Befehl der alle nicht abgeschlossenen Zeilen abfrägt
            string sql = $"SELECT * FROM schedule WHERE Completed = 0";

            SqlCommand cmd = new SqlCommand(sql, mssql.Con);

            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    // Die einzelnen Spalten des Eintrags
                    int      ID        = (int)reader["ID"];
                    string   Username  = reader["Username"].ToString();
                    string   UserSid   = reader["UserSid"].ToString();
                    string   Groupname = reader["Groupname"].ToString();
                    string   GroupSid  = reader["GroupSid"].ToString();
                    DateTime StartDate = (DateTime)reader["StartDate"];
                    DateTime EndDate   = (DateTime)reader["EndDate"];

                    DateTime EndDatePlus1 = (EndDate != DateTime.MaxValue) ? EndDate : EndDate.AddDays(1);

                    string Status  = reader["Status"].ToString();
                    string Creator = reader["Creator"].ToString();
                    string Comment = reader["Comment"].ToString();

                    // Das heutige Datum
                    DateTime now = DateTime.Today;

                    // Falls das Startdatum in der Vergangenheit liegt, das Enddatum in der Zukunft und der Status "planned" ist
                    // Plan startet
                    if (StartDate <= now && now <= EndDatePlus1 && Status == ConstStatus.Planned)
                    {
                        AddUserToGroup(UserSid, GroupSid);
                        WriteNoteToUser(UserSid, DateTime.Now.ToShortDateString() + " - " + Creator + " - Grp: " + Groupname + " hinzugefügt");
                        SetNewStatus(ID, ConstStatus.Set, false);
                    }

                    // Falls der folge Tag des Enddatums in der Vergangenheit liegt
                    // Plan ist abgelaufen
                    if (EndDatePlus1 <= now)
                    {
                        RemoveUserFromGroup(UserSid, GroupSid);
                        WriteNoteToUser(UserSid, DateTime.Now.ToShortDateString() + " - " + Creator + " - Grp: " + Groupname + " entfernt");
                        SetNewStatus(ID, ConstStatus.Terminate, true);
                    }

                    // Überprüft die gelöschten Einträge die aber noch nicht abgearbeitet worden sind
                    if (Status == "deleted")
                    {
                        // StartDate liegt in der Vergangenheit
                        // Die Gruppe wurde also schon gesetzt und muss wieder gelöscht werden
                        if (now <= StartDate)
                        {
                            RemoveUserFromGroup(UserSid, GroupSid);
                            WriteNoteToUser(UserSid, DateTime.Now.ToShortDateString() + " - " + Creator + " - Grp: " + Groupname + " entfernt");
                        }

                        // Setzt die Zeile auf Complete true
                        SetNewStatus(ID, Status, true);
                    }
                }
            }

            mssql.Close();
        }