/// <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); }
/// <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(); }
/// <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(); })); }
/// <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(); }
/// <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(); }
/// <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); }
/// <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(); }
public static void CloseConnection(MsSql msSql) { msSql.Close(); msSql.Dispose(); }
/// <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 } }
/// <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); } }
/// <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); } }
/// <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(); }