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

  • 相关阅读:
    Vue无缝滚动
    vue+Axios 实现路由拦截和登录拦截
    添加删除数组元素的方法
    日期时间相关
    Vue源码编译过程
    new关键字执行过程
    预解析
    echarts图表数据为空的时候不显示气泡
    arguments使用
    log4net介绍很全面
  • 原文地址:https://www.cnblogs.com/tldxh/p/7093360.html
Copyright © 2020-2023  润新知