參考: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,有更好的方法再更新