Excel 审核本地帐户状态、名称、全名、集团成员和;描述
我需要将结果导出到基于列的Excel文件或逗号分隔文件(CSV),以便能够在SQL Server 2008 R2中处理结果 我需要得到所有本地用户帐户的名称,全名,组成员和他们的描述 我在谷歌上搜索了一下,发现通过使用ADSI,我可以在某种程度上获得除状态之外的所有信息,如以下修改后的脚本所示:Excel 审核本地帐户状态、名称、全名、集团成员和;描述,excel,powershell,csv,bitwise-operators,adsi,Excel,Powershell,Csv,Bitwise Operators,Adsi,我需要将结果导出到基于列的Excel文件或逗号分隔文件(CSV),以便能够在SQL Server 2008 R2中处理结果 我需要得到所有本地用户帐户的名称,全名,组成员和他们的描述 我在谷歌上搜索了一下,发现通过使用ADSI,我可以在某种程度上获得除状态之外的所有信息,如以下修改后的脚本所示: clear Get-Content "C:\scripts\Servers.txt" | ForEach-Object { $Comp = $_ if (test-connection
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"
[]
我知道这个脚本是为了查询servers.txt
文档中的多个服务器而构建的,但是到目前为止,我只在其中输入了“localhost”。不过,我会保留它,以备将来需要
然而,当它达到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\u UserAccount
类提供。其余的可以通过和类获得
如果希望最后一次登录为DateTime
值,而不是WMI时间戳格式的字符串,则可以如下转换:
$nlp = Get-WmiObject -Computer $Comp -Class Win32_NetworkLoginProfile -Filter "Name='$('{0}\\{1}' -f $_.Domain, $_.Name)'"
$nlp.ConvertToDateTime($nlp.LastLogon)
([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,而是从[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 ', '
}
然后使用带有用户标志的函数更新脚本部分,如下所示:
$nlp = Get-WmiObject -Computer $Comp -Class Win32_NetworkLoginProfile -Filter "Name='$('{0}\\{1}' -f $_.Domain, $_.Name)'"
$nlp.ConvertToDateTime($nlp.LastLogon)
([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}}
}
谢谢…它为我解决了这个问题,我现在完成了脚本,能够获得所有需要的信息。谢谢你的回答…但是,我使用了完整的ANSI方法。