none
powershell脚本抓取的多元密码策略属性值msDS-ResultantPSO为空 RRS feed

  • 问题

  • 我公司在AD上启用的多元密码策略,应该在一个安全组A上,现在发现部分人密码策略没有应用。发现是这些人没有加入到安全组A上,现在想用脚本

    批量的查询一下指定OU下的哪些用户的msDS-ResultantPSO值为空,如果为空就说明没有应用到多元密码策略,我可以单独检查。

    Get-ADuser -searchbase "ou=***,dc=weigaogroup,dc=com" -filter * -Properties * | Select-Object Name,msDS-ResultantPSO,SID, Created,PasswordLastSet,@{n="lastLogonDate";e={[datetime]::FromFileTime($_.lastLogonTimestamp)}} | Export-CSV C:\Accountlist.csv -NoTypeInformation -Encoding UTF8

    不过上面的脚本查询出来所有的msDS-ResultantPSO都为空,这明显是不对的,我通过用户的属性编辑器都可以看到是有值的“CN=WGSY-PSO-Password,CN=Password Settings Container,CN=System,DC=*****,DC=com

    请问有什么办法可以批量查询出这个字段值或者有没有其他方法能查询出哪些用户没有应用多元密码策略?

    2019年6月26日 11:22

全部回复

  • 你好,

    谢谢你的提问。

    在我的测试结果中,我发现如果没有应用的PSO的用户下并没有发现该属性,我在ADUC中查看未应用的用户属性下并未看到该属性值。

    反之,如果该用户应用了该策略我发现该值将会出现,请尝试以下命令检查一下你发现在用户属性编辑器可以看到该属性值的用户。

    Get-ADUser -Identity "samaccountname" -Properties msDS-ResultantPSO

    samaccountname请替换成你真实用户的samaccountname.

    此外,以下脚本可以帮助你查看ou下用户密码应用状况。

    $userInfo = @()
    Import-Module ActiveDirectory
    Get-ADuser -Filter * -SearchBase "ou=***,dc=weigaogroup,dc=com"| %{
        $sAMAccountName = $null
        $sAMAccountName = $_.sAMAccountName
        $effectivePSO = $null
        $effectivePSO = (Get-ADuser $sAMAccountName -Properties "msDS-ResultantPSO")."msDS-ResultantPSO"
        If ($effectivePSO -ne $null){
            $objPSO = Get-ADObject -Identity $effectivePSO -Properties *
            $effectivePSOName = $objPSO.Name
            $effectivePSOMinPwdAge = ($objPSO."msDS-MinimumPasswordAge")/ -864000000000
            $effectivePSOMaxPwdAge = ($objPSO."msDS-MaximumPasswordAge")/ -864000000000
            $effectivePSOMinPwdLength = $objPSO."msDS-MinimumPasswordLength"
            $effectivePSOComplexEnabled = $objPSO."msDS-PasswordComplexityEnabled"
            $effectivePSOPwdHistoryLength = $objPSO."msDS-PasswordHistoryLength"
            $effectivePSOPwdRevEncrEnabled = $objPSO."msDS-PasswordReversibleEncryptionEnabled"
            $effectivePSOLockoutDuration = ($objPSO."msDS-LockoutDuration")/ -600000000
            $effectivePSOLockoutObservationWindow = ($objPSO."msDS-LockoutObservationWindow")/ -600000000
            $effectivePSOLockoutThreshold = $objPSO."msDS-LockoutThreshold"
        } Else {
            $objPSO = Get-ADObject -Identity (Get-ADRootDSE).defaultNamingContext -Properties minPwdAge,maxPwdAge,minPwdLength,pwdProperties,pwdHistoryLength,lockoutDuration,lockOutObservationWindow,lockoutThreshold
            $effectivePSOName = "Default Domain GPO"
            $effectivePSOMinPwdAge = (($objPSO.minPwdAge)/ -10000000) / 86400
            $effectivePSOMaxPwdAge = (($objPSO.maxPwdAge)/ -10000000) / 86400
            $effectivePSOMinPwdLength = $objPSO.minPwdLength
            If ($objPSO.pwdProperties -band 1) {$effectivePSOComplexEnabled = "True"} Else {$effectivePSOComplexEnabled= "False"}
            $effectivePSOPwdHistoryLength = $objPSO.pwdHistoryLength
            If ($objPSO.pwdProperties -band 16) {$effectivePSOPwdRevEncrEnabled  = "True"} Else {$effectivePSOPwdRevEncrEnabled = "False"}
            $effectivePSOLockoutDuration = ($objPSO.lockoutDuration)/ -600000000
            $effectivePSOLockoutObservationWindow = ($objPSO.lockOutObservationWindow)/ -600000000
            $effectivePSOLockoutThreshold = $objPSO.lockoutThreshold    
        }
        $userInfoEntry = "" | Select "Logon Account","Effective PSO","Min/Max Days","Len","Complex","Hist","Rev Encr","Lock Dur (m)","Lock Window (m)","Lock Thresh"
        $userInfoEntry."Logon Account" = $sAMAccountName
        $userInfoEntry."Effective PSO" = $effectivePSOName
        $userInfoEntry."Min/Max Days" = $([string]$effectivePSOMinPwdAge + "/" + [string]$effectivePSOMaxPwdAge)
        $userInfoEntry."Len" = $effectivePSOMinPwdLength
        $userInfoEntry."Complex" = $effectivePSOComplexEnabled
        $userInfoEntry."Hist" = $effectivePSOPwdHistoryLength
        $userInfoEntry."Rev Encr" = $effectivePSOPwdRevEncrEnabled
        $userInfoEntry."Lock Dur (m)" = $effectivePSOLockoutDuration
        $userInfoEntry."Lock Window (m)" = $effectivePSOLockoutObservationWindow
        $userInfoEntry."Lock Thresh" = $effectivePSOLockoutThreshold
        $userInfo += $userInfoEntry
    }
    Clear-Host
    $userInfo |  Export-CSV C:\Accountlist.csv -NoTypeInformation -Encoding UTF8 

    最好的祝福,

    Lee


    Just do it.

    2019年6月27日 3:04
    版主
  • 感谢您的回复,我通过命令查是能查出PSO的值,不过通过您的脚本查出来就是空白的。
    Get-ADUser -Identity "samaccountname" -Properties msDS-ResultantPSO
    2019年6月27日 6:27
  • 你好,

    谢谢你的回复。

    目前不知道什么原因,该脚本在我的实验环境生效,如果未设置多元密码策略的用户对象在“Effective PSO”属性下显示为默认密码策略,设置的将会显示应用的PSO的名称。

    如果该脚本不可行就暂时不使用该脚本了。

    现在,我想和您确认一下,是否在你的环境中也出现了,未配置多元密码策略的用户使用get-aduser命令的时候是否能够得到msDS-ResultantPSO属性的值,是否存在和我相同的情况,你可以在AD用户属性编辑器中看到该属性值的用户也可以使用powershell命令获得该属性,不能看到的用户使用该命令也无法得到。请帮忙回复确认一下该情况。

    如果确实如此,我会给你提供其他脚本。

    帮忙测试一下,等待你的回复。

    最好的祝福,

    Lee


    Just do it.

    2019年6月27日 7:19
    版主