AD域 根據 用戶屬性userAccountControl 來判斷用戶禁用屬性


參考:https://support.microsoft.com/zh-cn/help/305144/how-to-use-the-useraccountcontrol-flags-to-manipulate-user-account-pro

(如何使用 UserAccountControl 標志操縱用戶帳戶屬性)

因為2是 用戶禁用屬性,只要用戶禁用了,UserAccountControl 的屬性值就加了2了

那么2數值這么小,怎么判斷用戶確實被禁用了呢

之前看到博客說等於UserAccountControl 屬性值等於514的,

我原來也這么寫的,但這個很片面,很少、我很傻很天真。

                        string userAcc = subEntry.Properties["userAccountControl"].Value.ToString();
                        if (userAcc == "514")
                        {
                            isDelete = "Y";
                        }

 

就比如說UserAccountControl 屬性值等於66082就是禁用的用戶,算個算數

66082-65536(用戶密碼永不過期)=546

645-512(典型用戶的默認帳戶類型)=34

34-32(不需要密碼)=2

哇,里面含有2,是禁用的,完美

 

現在要寫個算法,算UserAccountControl 屬性值包含2。思路清晰明確。

 一下貼上我簡陋的function:

復制代碼
        /// <summary>
        /// 根據AD域的userAccountControl屬性判斷用戶是否禁用
        /// </summary>
        /// <param name="userAccContr"></param>
        /// <returns>是否禁用</returns>
        private bool GetUserDelete(int userAccContr)
        {
            if (userAccContr >= 16777216)            //TRUSTED_TO_AUTH_FOR_DELEGATION - 允許該帳戶進行委派
            {
                userAccContr = userAccContr - 16777216;
            }
            if (userAccContr >= 8388608)            //PASSWORD_EXPIRED - (Windows 2000/Windows Server 2003) 用戶的密碼已過期
            {
                userAccContr = userAccContr - 8388608;
            }
            if (userAccContr >= 4194304)            //DONT_REQ_PREAUTH
            {
                userAccContr = userAccContr - 4194304;
            }
            if (userAccContr >= 2097152)            //USE_DES_KEY_ONLY - (Windows 2000/Windows Server 2003) 將此用戶限制為僅使用數據加密標准 (DES) 加密類型的密鑰
            {
                userAccContr = userAccContr - 2097152;
            }
            if (userAccContr >= 1048576)            //NOT_DELEGATED - 設置此標志后,即使將服務帳戶設置為信任其進行 Kerberos 委派,也不會將用戶的安全上下文委派給該服務
            {
                userAccContr = userAccContr - 1048576;
            }
            if (userAccContr >= 524288)            //TRUSTED_FOR_DELEGATION - 設置此標志后,將信任運行服務的服務帳戶(用戶或計算機帳戶)進行 Kerberos 委派。任何此類服務都可模擬請求該服務的客戶端。若要允許服務進行 Kerberos 委派,必須在服務帳戶的 userAccountControl 屬性上設置此標志
            {
                userAccContr = userAccContr - 524288;
            }
            if (userAccContr >= 262144)            //SMARTCARD_REQUIRED - 設置此標志后,將強制用戶使用智能卡登錄
            {
                userAccContr = userAccContr - 262144;
            }
            if (userAccContr >= 131072)            //MNS_LOGON_ACCOUNT - 這是 MNS 登錄帳戶
            {
                userAccContr = userAccContr - 131072;
            }
            if (userAccContr >= 65536)            //DONT_EXPIRE_PASSWORD-密碼永不過期
            {
                userAccContr = userAccContr - 65536;
            }
            if (userAccContr >= 2097152)            //MNS_LOGON_ACCOUNT - 這是 MNS 登錄帳戶
            {
                userAccContr = userAccContr - 2097152;
            }
            if (userAccContr >= 8192)            //SERVER_TRUST_ACCOUNT - 這是屬於該域的域控制器的計算機帳戶
            {
                userAccContr = userAccContr - 8192;
            }
            if (userAccContr >= 4096)            //WORKSTATION_TRUST_ACCOUNT - 這是運行 Microsoft Windows NT 4.0 Workstation、Microsoft Windows NT 4.0 Server、Microsoft Windows 2000 Professional 或 Windows 2000 Server 並且屬於該域的計算機的計算機帳戶
            {
                userAccContr = userAccContr - 4096;
            }
            if (userAccContr >= 2048)            //INTERDOMAIN_TRUST_ACCOUNT - 對於信任其他域的系統域,此屬性允許信任該系統域的帳戶
            {
                userAccContr = userAccContr - 2048;
            }
            if (userAccContr >= 512)            //NORMAL_ACCOUNT - 這是表示典型用戶的默認帳戶類型
            {
                userAccContr = userAccContr - 512;
            }

            if (userAccContr >= 256)            //TEMP_DUPLICATE_ACCOUNT - 此帳戶屬於其主帳戶位於另一個域中的用戶。此帳戶為用戶提供訪問該域的權限,但不提供訪問信任該域的任何域的權限。有時將這種帳戶稱為“本地用戶帳戶”
            {
                userAccContr = userAccContr - 256;
            }
            if (userAccContr >= 128)            //ENCRYPTED_TEXT_PASSWORD_ALLOWED - 用戶可以發送加密的密碼
            {
                userAccContr = userAccContr - 128;
            }
            if (userAccContr >= 64)            //PASSWD_CANT_CHANGE - 用戶不能更改密碼。可以讀取此標志,但不能直接設置它
            {
                userAccContr = userAccContr - 64;
            }
            if (userAccContr >= 32)            //PASSWD_NOTREQD - 不需要密碼
            {
                userAccContr = userAccContr - 32;
            }
            if (userAccContr >= 16)            //LOCKOUT
            {
                userAccContr = userAccContr - 16;
            }
            if (userAccContr >= 8)            //HOMEDIR_REQUIRED - 需要主文件夾
            {
                userAccContr = userAccContr - 8;
            }
            //if (userAccContr >= 2)            //ACCOUNTDISABLE - 禁用用戶帳戶
            //{
            //    userAccContr = userAccContr - 2;
            //}
            //if (userAccContr >= 1)            //SCRIPT - 將運行登錄腳本
            //{
            //    userAccContr = userAccContr - 1;
            //}
            if (userAccContr >= 2)
            {
                return true;
            }
            return false;
        }
復制代碼

調用部分:

復制代碼
                      string isDelete = "N";
                      string userAccContr = subEntry.Properties["userAccountControl"].Value.ToString();
                        if (!string.IsNullOrEmpty(userAccContr))
                        {
                            if (GetUserDelete(int.Parse(userAccContr)))
                            {
                                isDelete = "Y";
                            }
                        }
復制代碼

OVER,有更好的方法再更新

轉自:https://www.cnblogs.com/tldxh/p/7093360.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM