计算 WMI 中的位图位值 class

Calculating BitMaps BitValues in a WMI class

我正在使用 "Win32_NetworkLoginProfile " class 在我的本地系统上提取用户信息。当我在我的机器的 Powershell 中执行 "Get-WmiObject -class Win32_NetworkLoginProfile | Select * " 时,我得到 Flags = 513。我已经检查了 MSDN link (https://msdn.microsoft.com/en-us/library/aa394221%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396) 以获得此 class 的详细信息。我在这里有一个问题:

Flags = 513 与 Flags 的 BitValues 中的任何值都不匹配。我怎么知道513代表什么?

谢谢。

Flags = 513二进制格式是10 0000 0001,所以可以看到第0和第9位是on,根据link映射如下:

bit 0 = Script
bit 1 = Account Disabled
bit 3 = Home Dir Required
bit 4 = Lockout
bit 5 = Password Not Required
bit 6 = Paswword Can't Change
bit 7 = Encrypted Test Password Allowed
bit 8 = Temp Duplicate Account
bit 9 = Normal Account
bit 11 = InterDomain Trust Account
bit 12 = WorkStation Trust Account
bit 13 = Server Trust Account
bit 16 = Don't Expire Password
bit 17 = MNS Logon Account
bit 18 = Smartcard Required
bit 19 = Trusted For Delegation
bit 20 = Not Delegated
bit 21 = Use DES Key Only
bit 22 = Don't Require Preauthorization
bit 23 = Password Expired

最后513对应Script(执行的登录脚本。LAN Manager 2.0必须设置此值,Windows NT/Windows 2000)和Normal Account(代表典型用户的默认帐户类型)。

顺便说一句,您可以从 属性 限定词中检索地图,看看 .

您可以按照以下步骤实现一个功能,根据传入的数字从地图返回值。假设已经创建了一个包含位数字作为键和相应值的字典。 WMI returns 值 513 为字符串,您应该将其转换为数字,假设它是 v 变量。创建一个从 310 的循环,比方说 i 变量。在每次迭代中,如果 v 大于或等于 2 ^ i,则将带有 i 键的项从字典添加到输出数组,并将 v 减少 2 ^ i.结果,输出数组包含字典中的项目,这些项目的键对应于传入值中打开的位数。

我必须在 python 中完成同样的任务,但您可以轻松地将其转换为其他语言:

def bit_mapper(flag,goal="translate",check_bit=int):
    bit_map_dic = {
        "0":"Script",
        "1":"Account Disabled",
        "3":"Home Dir Required",
        "4":"Lockout",
        "5":"Password Not Required",
        "6":"Paswword Can't Change",
        "7":"Encrypted Test Password Allowed",
        "8":"Temp Duplicate Account",
        "9":"Normal Account",
        "11":"InterDomain Trust Account",
        "12":"WorkStation Trust Account",
        "13":"Server Trust Account",
        "16":"Don't Expire Password",
        "17":"MNS Logon Account",
        "18":"Smartcard Required",
        "19":"Trusted For Delegation",
        "20":"Not Delegated",
        "21":"Use DES Key Only",
        "22":"Don't Require Preauthorization",
        "23":"Password Expired"
    }
    flag=int(flag)
    map="{0:b}".format(flag)
    if goal == "translate":
        temp = []
        for bit in enumerate(map):
            if bit[1] is "1":
                temp.append(str(bit_map_dic[str(bit[0])]))
        return temp
    elif goal == "check":
        for bit in enumerate(map):
            if bit[0] == int(check_bit) and bit[1] is "1":
                return True
        return False

调用此函数的两种方法..

1.) 如果你想将 Flag 映射到单词:

print bit_mapper("513")

2.) 检查是否设置了一个位

print bit_mapper("513",goal="check",check_bit="9")