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數值這麼小,怎麼判斷用戶確實被禁用了呢spa

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

我原來也這麼寫的,但這個很片面,不多、我很傻很天真。blog

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

 

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

66082-65536(用戶密碼永不過時)=546博客

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

34-32(不須要密碼)=2io

哇,裏面含有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,有更好的方法再更新

相關文章
相關標籤/搜索