审核本地帐户状态、名称、全名、组成员资格和描述
Audit local accounts status, name, fullname, group membership & description
我需要将结果导出到基于列的 Excel 文件或逗号分隔文件 (CSV),以便能够在 SQL Server 2008 R2 中处理结果。
我需要获取所有本地用户帐户的名称、全名、组成员身份及其描述。
我一直在谷歌上安静地搜索一下,发现我可以通过使用 ADSI 以某种方式获取除状态之外的所有内容,如以下修改后的脚本所示:
clear
Get-Content "C:\scripts\Servers.txt" | ForEach-Object {
$Comp = $_
if (test-connection -computername $Comp -count 1 -quiet) {
([ADSI]"WinNT://$comp").Children | ? {$_.SchemaClassName -eq 'user'} | % {
$groups = $_.Groups() | % {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
$_ | Select @{n='Användarnamn:';e={$_.Name}},
@{n='Fullständigt Namn:';e={$_.FullName}},
@{n='Senast Använt:';e={$_.LastLogin}},
@{n='Tillhör grupp(er):';e={$groups -join ';'}},
@{n='Beskrivning:';e={$_.Description}}
}
} else {
Write-Warning "Server '$Comp' is Unreachable hence Could not fetch data"
}
} | Export-Csv -NoTypeInformation -Encoding UTF8 -Delimiter ";" -Path "C:\scripts\LocalUsers.csv"
[Source]
我知道此脚本是为查询 servers.txt
文档中的多个服务器而构建的,但截至目前,我只在其中输入了 "localhost"。不过,我保留了这个,以备日后需要。
然而,当它到达获取"disabled"或"active"帐户状态的ADSI值时,我碰壁了。它输出值的方式似乎让我有点惊讶。
然而,在谷歌搜索并发现它可能会或可能不会通过按位转换来获得它之后,我开始查看 PowerShell 中的 Get-WmiObject
命令以组合 "disabled" Get-WmiObject
上面 ADSI 命令的值,来自下面的脚本。
Get-WmiObject -Class Win32_UserAccount -Filter "LocalAccount='True'" |
Select Name, FullName, Disabled, Lockout, PasswordRequired, PasswordChangeable |
Export-Csv -NoTypeInformation -Encoding UTF8 -Delimiter "," -Path "C:\scripts\AccountDisabled.csv"
但是,我不确定如何合并结果(或解决 ADSI 转换值),以便它进入相同的基于列的 Excel 文件或 CSV 文件。
一切都使用 WMI。 Win32_UserAccount
class 已经提供了您想要的大部分信息。其余的可以通过 calculated properties from the Win32_NetworkLoginProfile
and Win32_GroupUser
classes.
获得
Get-Content "C:\scripts\Servers.txt" | ForEach-Object {
$Comp = $_
if (Test-Connection -ComputerName $Comp -Count 1 -Quiet) {
Get-WmiObject -Computer $Comp -Class Win32_UserAccount -Filter "LocalAccount='True'" |
Select Name, FullName, Disabled, Lockout, PasswordRequired, PasswordChangeable,
@{n='LastLogin';e={Get-WmiObject -Computer $Comp -Class Win32_NetworkLoginProfile -Filter "Name='$('{0}\{1}' -f $_.Domain, $_.Name)'" | select -Expand LastLogon}},
@{n='Groups';e={([wmi](Get-WmiObject -Computer $Comp -Class Win32_GroupUser -Filter "PartComponent='$($_.Path -replace '\','\')'" | select -Expand GroupComponent) | select -Expand Name) -join ';'}}
} else {
Write-Warning "Server '$Comp' is Unreachable hence Could not fetch data"
}
} | Export-Csv -NoTypeInformation -Encoding UTF8 -Delimiter ";" -Path "C:\scripts\LocalUsers.csv"
如果您希望上次登录为 DateTime
值而不是 WMI 时间戳格式的字符串,您可以像这样转换它:
$nlp = Get-WmiObject -Computer $Comp -Class Win32_NetworkLoginProfile -Filter "Name='$('{0}\{1}' -f $_.Domain, $_.Name)'"
$nlp.ConvertToDateTime($nlp.LastLogon)
您可以使用此函数将用户标志转换为可读值:
这样你就完全不需要使用WMI了,全部从[adsi]
Function Convert-UserFlag {
Param ($UserFlag)
$List = New-Object System.Collections.ArrayList
Switch ($UserFlag) {
($UserFlag -BOR 0x0001) {[void]$List.Add('SCRIPT')}
($UserFlag -BOR 0x0002) {[void]$List.Add('ACCOUNTDISABLE')}
($UserFlag -BOR 0x0008) {[void]$List.Add('HOMEDIR_REQUIRED')}
($UserFlag -BOR 0x0010) {[void]$List.Add('LOCKOUT')}
($UserFlag -BOR 0x0020) {[void]$List.Add('PASSWD_NOTREQD')}
($UserFlag -BOR 0x0040) {[void]$List.Add('PASSWD_CANT_CHANGE')}
($UserFlag -BOR 0x0080) {[void]$List.Add('ENCRYPTED_TEXT_PWD_ALLOWED')}
($UserFlag -BOR 0x0100) {[void]$List.Add('TEMP_DUPLICATE_ACCOUNT')}
($UserFlag -BOR 0x0200) {[void]$List.Add('NORMAL_ACCOUNT')}
($UserFlag -BOR 0x0800) {[void]$List.Add('INTERDOMAIN_TRUST_ACCOUNT')}
($UserFlag -BOR 0x1000) {[void]$List.Add('WORKSTATION_TRUST_ACCOUNT')}
($UserFlag -BOR 0x2000) {[void]$List.Add('SERVER_TRUST_ACCOUNT')}
($UserFlag -BOR 0x10000) {[void]$List.Add('DONT_EXPIRE_PASSWORD')}
($UserFlag -BOR 0x20000) {[void]$List.Add('MNS_LOGON_ACCOUNT')}
($UserFlag -BOR 0x40000) {[void]$List.Add('SMARTCARD_REQUIRED')}
($UserFlag -BOR 0x80000) {[void]$List.Add('TRUSTED_FOR_DELEGATION')}
($UserFlag -BOR 0x100000) {[void]$List.Add('NOT_DELEGATED')}
($UserFlag -BOR 0x200000) {[void]$List.Add('USE_DES_KEY_ONLY')}
($UserFlag -BOR 0x400000) {[void]$List.Add('DONT_REQ_PREAUTH')}
($UserFlag -BOR 0x800000) {[void]$List.Add('PASSWORD_EXPIRED')}
($UserFlag -BOR 0x1000000) {[void]$List.Add('TRUSTED_TO_AUTH_FOR_DELEGATION')}
($UserFlag -BOR 0x04000000) {[void]$List.Add('PARTIAL_SECRETS_ACCOUNT')}
}
$List -join ', '
}
然后更新您的脚本部分,使用带有用户标志的函数,如下所示:
([ADSI]"WinNT://$comp").Children | ? {$_.SchemaClassName -eq 'user'} | % {
$groups = $_.Groups() | % {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
$_ | Select @{n='Användarnamn:';e={$_.Name}},
@{n='Fullständigt Namn:';e={$_.FullName}},
@{n='Senast Använt:';e={$_.LastLogin}},
@{n='Tillhör grupp(er):';e={$groups -join ';'}},
@{n='Beskrivning:';e={$_.Description}},
@{n='Status:';e={Convert-UserFlag $_.Userflags.Value}}
}
我需要将结果导出到基于列的 Excel 文件或逗号分隔文件 (CSV),以便能够在 SQL Server 2008 R2 中处理结果。
我需要获取所有本地用户帐户的名称、全名、组成员身份及其描述。
我一直在谷歌上安静地搜索一下,发现我可以通过使用 ADSI 以某种方式获取除状态之外的所有内容,如以下修改后的脚本所示:
clear
Get-Content "C:\scripts\Servers.txt" | ForEach-Object {
$Comp = $_
if (test-connection -computername $Comp -count 1 -quiet) {
([ADSI]"WinNT://$comp").Children | ? {$_.SchemaClassName -eq 'user'} | % {
$groups = $_.Groups() | % {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
$_ | Select @{n='Användarnamn:';e={$_.Name}},
@{n='Fullständigt Namn:';e={$_.FullName}},
@{n='Senast Använt:';e={$_.LastLogin}},
@{n='Tillhör grupp(er):';e={$groups -join ';'}},
@{n='Beskrivning:';e={$_.Description}}
}
} else {
Write-Warning "Server '$Comp' is Unreachable hence Could not fetch data"
}
} | Export-Csv -NoTypeInformation -Encoding UTF8 -Delimiter ";" -Path "C:\scripts\LocalUsers.csv"
[Source]
我知道此脚本是为查询 servers.txt
文档中的多个服务器而构建的,但截至目前,我只在其中输入了 "localhost"。不过,我保留了这个,以备日后需要。
然而,当它到达获取"disabled"或"active"帐户状态的ADSI值时,我碰壁了。它输出值的方式似乎让我有点惊讶。
然而,在谷歌搜索并发现它可能会或可能不会通过按位转换来获得它之后,我开始查看 PowerShell 中的 Get-WmiObject
命令以组合 "disabled" Get-WmiObject
上面 ADSI 命令的值,来自下面的脚本。
Get-WmiObject -Class Win32_UserAccount -Filter "LocalAccount='True'" |
Select Name, FullName, Disabled, Lockout, PasswordRequired, PasswordChangeable |
Export-Csv -NoTypeInformation -Encoding UTF8 -Delimiter "," -Path "C:\scripts\AccountDisabled.csv"
但是,我不确定如何合并结果(或解决 ADSI 转换值),以便它进入相同的基于列的 Excel 文件或 CSV 文件。
一切都使用 WMI。 Win32_UserAccount
class 已经提供了您想要的大部分信息。其余的可以通过 calculated properties from the Win32_NetworkLoginProfile
and Win32_GroupUser
classes.
Get-Content "C:\scripts\Servers.txt" | ForEach-Object {
$Comp = $_
if (Test-Connection -ComputerName $Comp -Count 1 -Quiet) {
Get-WmiObject -Computer $Comp -Class Win32_UserAccount -Filter "LocalAccount='True'" |
Select Name, FullName, Disabled, Lockout, PasswordRequired, PasswordChangeable,
@{n='LastLogin';e={Get-WmiObject -Computer $Comp -Class Win32_NetworkLoginProfile -Filter "Name='$('{0}\{1}' -f $_.Domain, $_.Name)'" | select -Expand LastLogon}},
@{n='Groups';e={([wmi](Get-WmiObject -Computer $Comp -Class Win32_GroupUser -Filter "PartComponent='$($_.Path -replace '\','\')'" | select -Expand GroupComponent) | select -Expand Name) -join ';'}}
} else {
Write-Warning "Server '$Comp' is Unreachable hence Could not fetch data"
}
} | Export-Csv -NoTypeInformation -Encoding UTF8 -Delimiter ";" -Path "C:\scripts\LocalUsers.csv"
如果您希望上次登录为 DateTime
值而不是 WMI 时间戳格式的字符串,您可以像这样转换它:
$nlp = Get-WmiObject -Computer $Comp -Class Win32_NetworkLoginProfile -Filter "Name='$('{0}\{1}' -f $_.Domain, $_.Name)'"
$nlp.ConvertToDateTime($nlp.LastLogon)
您可以使用此函数将用户标志转换为可读值: 这样你就完全不需要使用WMI了,全部从[adsi]
Function Convert-UserFlag {
Param ($UserFlag)
$List = New-Object System.Collections.ArrayList
Switch ($UserFlag) {
($UserFlag -BOR 0x0001) {[void]$List.Add('SCRIPT')}
($UserFlag -BOR 0x0002) {[void]$List.Add('ACCOUNTDISABLE')}
($UserFlag -BOR 0x0008) {[void]$List.Add('HOMEDIR_REQUIRED')}
($UserFlag -BOR 0x0010) {[void]$List.Add('LOCKOUT')}
($UserFlag -BOR 0x0020) {[void]$List.Add('PASSWD_NOTREQD')}
($UserFlag -BOR 0x0040) {[void]$List.Add('PASSWD_CANT_CHANGE')}
($UserFlag -BOR 0x0080) {[void]$List.Add('ENCRYPTED_TEXT_PWD_ALLOWED')}
($UserFlag -BOR 0x0100) {[void]$List.Add('TEMP_DUPLICATE_ACCOUNT')}
($UserFlag -BOR 0x0200) {[void]$List.Add('NORMAL_ACCOUNT')}
($UserFlag -BOR 0x0800) {[void]$List.Add('INTERDOMAIN_TRUST_ACCOUNT')}
($UserFlag -BOR 0x1000) {[void]$List.Add('WORKSTATION_TRUST_ACCOUNT')}
($UserFlag -BOR 0x2000) {[void]$List.Add('SERVER_TRUST_ACCOUNT')}
($UserFlag -BOR 0x10000) {[void]$List.Add('DONT_EXPIRE_PASSWORD')}
($UserFlag -BOR 0x20000) {[void]$List.Add('MNS_LOGON_ACCOUNT')}
($UserFlag -BOR 0x40000) {[void]$List.Add('SMARTCARD_REQUIRED')}
($UserFlag -BOR 0x80000) {[void]$List.Add('TRUSTED_FOR_DELEGATION')}
($UserFlag -BOR 0x100000) {[void]$List.Add('NOT_DELEGATED')}
($UserFlag -BOR 0x200000) {[void]$List.Add('USE_DES_KEY_ONLY')}
($UserFlag -BOR 0x400000) {[void]$List.Add('DONT_REQ_PREAUTH')}
($UserFlag -BOR 0x800000) {[void]$List.Add('PASSWORD_EXPIRED')}
($UserFlag -BOR 0x1000000) {[void]$List.Add('TRUSTED_TO_AUTH_FOR_DELEGATION')}
($UserFlag -BOR 0x04000000) {[void]$List.Add('PARTIAL_SECRETS_ACCOUNT')}
}
$List -join ', '
}
然后更新您的脚本部分,使用带有用户标志的函数,如下所示:
([ADSI]"WinNT://$comp").Children | ? {$_.SchemaClassName -eq 'user'} | % {
$groups = $_.Groups() | % {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
$_ | Select @{n='Användarnamn:';e={$_.Name}},
@{n='Fullständigt Namn:';e={$_.FullName}},
@{n='Senast Använt:';e={$_.LastLogin}},
@{n='Tillhör grupp(er):';e={$groups -join ';'}},
@{n='Beskrivning:';e={$_.Description}},
@{n='Status:';e={Convert-UserFlag $_.Userflags.Value}}
}