审计本地帐户状态,名称,全名,组成员资格和说明

我需要将结果导出到基于列的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" 

[ 来源 ]

我知道这个脚本是build立在servers.txt文件中查询几个服务器的,但是到目前为止我只有“localhost”在那里input。 但是,在未来需要的情况下,我会保留这一点。

但是,当ADSI获得“禁用”或“激活”账户状态值时,我就打了一堵墙。 它似乎以一种让我感到惊讶的方式输出价值。

然而,谷歌search后,发现它可能或不能通过按位转换得到这个东西,我开始在PowerShell中查看Get-WmiObject命令,将“禁用”的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,并从[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}} } 

使用WMI的一切。 你想要的大部分信息已经由Win32_UserAccount类提供。 其余的可以通过Win32_NetworkLoginProfileWin32_GroupUser类的计算属性来获得。

 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" 

如果您希望上次login为DateTime值而不是WMI时间戳格式的string,则可以将其转换为:

 $nlp = Get-WmiObject -Computer $Comp -Class Win32_NetworkLoginProfile -Filter "Name='$('{0}\\{1}' -f $_.Domain, $_.Name)'" $nlp.ConvertToDateTime($nlp.LastLogon) 
    Interesting Posts