2024年3月19日 星期二

[研究]C#,顯示「帳戶原則」(「密碼原則」、「帳戶鎖定原則」)結果

[研究]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 "尚未設定";
             }
         }
     }
}


(完)

相關

沒有留言:

張貼留言