2015-09-30 24 views
0

我需要將結果導出到基於列的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」。但是,我保留這一點以備將來需要時使用。

但是,當它達到獲得「禁用」或「活動」帳戶狀態的ADSI值時,我撞牆了。它似乎以一種讓我感到驚訝的方式輸出價值。

然而,在Google上搜索並找出它可能會或可能不會通過逐位轉換來獲得此結果,我開始查看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文件。

回答

2

您可以使用此功能來將用戶標記爲可讀值: 這樣,您就不需要使用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}} 
     } 
+0

謝謝......它爲我解決了這個問題,現在我完成了腳本以獲得所需的所有信息。 –

0

使用WMI的一切。大部分您想要的信息已由Win32_UserAccount課程提供。其餘的可以通過Win32_NetworkLoginProfileWin32_GroupUser類的calculated properties獲得。

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) 
+0

感謝您的回答......但是,我使用了完整的ANSI方法。 –