[研究]C#,顯示「帳戶原則」(「密碼原則」、「帳戶鎖定原則」)結果
2024-03-19
環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19
密碼原則
- 使用可還原的加密來存放密碼
- 密碼必須符合複雜性需求
- 密碼最短使用期限
- 密碼最長使用期限
- 強制執行密碼歷程記錄
- 最小密碼長度
已啟用 ? 已停用? 尚未定義 ?
********************************************************************************
WinForm 程式
using System; using System.Windows.Forms; namespace ServerHealthCheckWindowsFormsApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { try { richTextBox1.AppendText("rsop.msc\n"); richTextBox1.AppendText("電腦設定\\Windows設定\\安全性設定\\帳戶原則\\密碼原則\n\n"); #region === 使用可還原的加密來存放密碼 === string registryPath = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"; object clearTextPasswordValue = Microsoft.Win32.Registry.GetValue(registryPath, "ClearTextPassword", null); if (clearTextPasswordValue != null) { int value = Convert.ToInt32(clearTextPasswordValue); if (value == 1) { richTextBox1.AppendText("使用可還原的加密來存放密碼:已啟用\n"); } else { richTextBox1.AppendText("使用可還原的加密來存放密碼:已停用\n"); } //精簡寫法 //richTextBox1.AppendText("使用可還原的加密來存放密碼:" + ((Boolean)clearTextPasswordValue ? "已啟用" : "已停用") + "\n"); } else { richTextBox1.AppendText("使用可還原的加密來存放密碼:尚未定義\n"); }//精簡寫法 (尚未測試) richTextBox1.AppendText($"使用可還原的加密來存放密碼:{(clearTextPasswordValue != null && (int)clearTextPasswordValue == 1 ? "已啟用 " : (clearTextPasswordValue != null && (int)clearTextPasswordValue != 1 ? " 已停用 " : " 尚未定義 "))}\n"); #endregion === 使用可還原的加密來存放密碼 === #region === 密碼必須符合複雜性需求 === registryPath = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"; // Read the value of the "PasswordComplexity" registry key object passwordComplexityValue = Microsoft.Win32.Registry.GetValue(registryPath, "PasswordComplexity", null); if (passwordComplexityValue != null) { richTextBox1.AppendText("密碼必須符合複雜性需求:" + ((Boolean)passwordComplexityValue ? "已啟用" : "已停用") + "\n"); } else { richTextBox1.AppendText("密碼必須符合複雜性需求:尚未定義\n"); } #endregion === 密碼必須符合複雜性需求 === #region === 密碼最短使用期限 === registryPath = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"; object minimumPasswordAgeValue = Microsoft.Win32.Registry.GetValue(registryPath, "MinimumPasswordAge", null); if (minimumPasswordAgeValue != null) { int valueInSeconds = Convert.ToInt32(minimumPasswordAgeValue); int valueInDays = valueInSeconds / (60 * 60 * 24); // Convert to number of days richTextBox1.AppendText("密碼最短使用期限:" + valueInDays.ToString() + " 天\n"); } else { richTextBox1.AppendText("密碼最短使用期限:尚未定義\n"); } #endregion === 密碼最短使用期限 === #region === 密碼最長使用期限=== registryPath = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"; object maximumPasswordAgeValue = Microsoft.Win32.Registry.GetValue(registryPath, "MaximumPasswordAge", null); if (maximumPasswordAgeValue != null) { int valueInSeconds = Convert.ToInt32(maximumPasswordAgeValue); int valueInDays = valueInSeconds / (60 * 60 * 24); // Convert to number of days richTextBox1.AppendText("密碼最長使用期限:" + valueInDays.ToString() + " 天\n"); } else { richTextBox1.AppendText("密碼最長使用期限:尚未定義\n"); } #endregion === 密碼最長使用期限=== #region === 密碼最短使用期限、密碼最長使用期限=== // Console 寫法 //object minimumPasswordAgeValue = Microsoft.Win32.Registry.GetValue(registryPath, "MinimumPasswordAge", null); //object maximumPasswordAgeValue = Microsoft.Win32.Registry.GetValue(registryPath, "MaximumPasswordAge", null); string minimumPasswordAgeStatus = minimumPasswordAgeValue != null ? "已設定" : "尚未設定"; string minimumPasswordAgeValueText = minimumPasswordAgeValue != null ? $"(設定值:{minimumPasswordAgeValue})" : ""; string maximumPasswordAgeStatus = maximumPasswordAgeValue != null ? "已設定" : "尚未設定"; string maximumPasswordAgeValueText = maximumPasswordAgeValue != null ? $"(設定值:{maximumPasswordAgeValue})" : ""; Console.WriteLine("密碼最短使用期限:{0} {1}", minimumPasswordAgeStatus, minimumPasswordAgeValueText); Console.WriteLine("密碼最長使用期限:{0} {1}", maximumPasswordAgeStatus, maximumPasswordAgeValueText); #endregion === 密碼最短使用期限、密碼最長使用期限=== #region === 強制執行密碼歷程記錄 === registryPath = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"; object passwordHistorySizeValue = Microsoft.Win32.Registry.GetValue(registryPath, "PasswordHistorySize", null); if (passwordHistorySizeValue != null) { int value = Convert.ToInt32(passwordHistorySizeValue); if (value > 0) { richTextBox1.AppendText("強制執行密碼歷程記錄:已停用\n"); richTextBox1.AppendText("密碼歷程記錄秒數:" + value.ToString() + "\n"); } else { richTextBox1.AppendText("強制執行密碼歷程記錄:已停用\n"); } } else { richTextBox1.AppendText("強制執行密碼歷程記錄:尚未定義\n"); } #endregion === 強制執行密碼歷程記錄 === #region === 最小密碼長度 === registryPath = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"; object minimumPasswordLengthValue = Microsoft.Win32.Registry.GetValue(registryPath, "MinimumPasswordLength", null); if (minimumPasswordLengthValue != null) { int value = Convert.ToInt32(minimumPasswordLengthValue); Console.WriteLine("Minimum password length: {0}", value); richTextBox1.AppendText("最小密碼長度:" + value.ToString() + "\n"); } else { richTextBox1.AppendText("最小密碼長度:尚未定義\n"); } #endregion === 最小密碼長度 === } catch (Exception ex) { richTextBox1.AppendText("發生異常:" + ex.Message.ToString()); } // Console 增加 //finally //{ // Console.WriteLine("按下任意鍵退出..."); // Console.ReadKey(); //} } } } |
********************************************************************************
【電腦設定\Windows設定\安全性設定\帳戶原則\帳戶鎖定原則】
重設帳戶鎖定計數器的時間間隔
帳戶鎖定期間
帳戶鎖定閾值
已啟用 ? 已停用? 尚未設定 ? 值 ? 繁體中文
using Microsoft.Win32; using System; using System.Windows.Forms; namespace AccountLockoutPolicyExample { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { try { // 本機的登錄路徑 string registryPath = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"; // 讀取 "ResetLockoutCount" 註冊表鍵的值 object resetLockoutCountValue = Registry.GetValue($"HKEY_LOCAL_MACHINE\\{registryPath}", "ResetLockoutCount", null); // 檢查策略的狀態 string resetLockoutCountStatus = GetPolicyStatus(resetLockoutCountValue); // 讀取 "LockoutDuration" 註冊表鍵的值 object lockoutDurationValue = Registry.GetValue($"HKEY_LOCAL_MACHINE\\{registryPath}", "LockoutDuration", null); string lockoutDurationStatus = GetPolicyStatus(lockoutDurationValue); // 讀取 "LockoutThreshold" 註冊表鍵的值 object lockoutThresholdValue = Registry.GetValue($"HKEY_LOCAL_MACHINE\\{registryPath}", "LockoutThreshold", null); string lockoutThresholdStatus = GetPolicyStatus(lockoutThresholdValue); // 顯示結果 richTextBox.Text = $"重設帳戶鎖定計數器的時間間隔:{resetLockoutCountStatus}\n" + $"帳戶鎖定期間:{lockoutDurationStatus}\n" + $"帳戶鎖定閾值:{lockoutThresholdStatus}"; } catch (Exception ex) { richTextBox.Text = $"發生例外狀況:{ex.Message}"; } } private string GetPolicyStatus(object policyValue) { if (policyValue != null) { return $"已啟用 (值:{policyValue})"; } else { return "尚未設定"; } } } } |
(完)
相關
沒有留言:
張貼留言