2015-09-30 1 views
0

Je dois exporter le résultat dans un fichier Excel basé sur une colonne ou un fichier CSV (Comma Separated File) pour pouvoir traiter le résultat dans SQL Server 2008 R2.Audit des comptes locaux statut, nom, nom complet, appartenance au groupe et description

Je suis dans le besoin d'obtenir tous les noms de compte d'utilisateur local, les noms complets, l'appartenance à un groupe et leur description.

Je suis googler ce calme un peu et a trouvé que je pouvais obtenir tout mais le statut d'une manière en utilisant ADSI, tel que présenté dans le script modifié suivant:

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]

Je suis conscient que ce script est construit pour interroger plusieurs serveurs dans le document servers.txt, mais pour l'instant, j'ai seulement "localhost" entré là-dedans. Cependant, je le garde comme ceci en cas de besoin dans le futur. Cependant, quand il est arrivé à la valeur ADSI d'obtenir le statut de compte "désactivé" ou "actif", je frappe un mur. Il semble produire la valeur d'une manière qui me surprend un peu. Cependant, après avoir recherché sur google et découvert qu'il peut ou ne peut pas obtenir cela en convertissant bitwise-quelque chose, j'ai commencé à regarder la commande dans PowerShell pour combiner la valeur "désactivée" avec la commande ADSI ci-dessus , du script ci-dessous.

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" 

Cependant, je ne suis pas sûr de la façon de combiner le résultat (ou résoudre la valeur de conversion ADSI) afin qu'il soit dans le même fichier Excel en colonnes ou fichier CSV.

Répondre

2

Vous pouvez utiliser cette fonction pour traduire les drapeaux de l'utilisateur à un valeurs lisibles: de cette façon, vous n'avez pas besoin d'utiliser WMI du tout, et le font tout de [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 ', ' 

} 

jour Ensuite, votre section de script, en utilisant la fonct ion avec les drapeaux de l'utilisateur, comme ceci:

([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

Merci ... ça l'a résolu pour moi et j'ai maintenant terminé le script pour pouvoir obtenir toutes les infos nécessaires. –

0

Utilisez WMI pour tout. La plupart des informations que vous souhaitez sont déjà fournies par la classe Win32_UserAccount. Le reste peut être obtenu via calculated properties des classes Win32_NetworkLoginProfile et Win32_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" 

Si vous souhaitez que la dernière ouverture de session en tant que valeur DateTime au lieu d'une chaîne au format d'horodatage WMI vous pouvez le convertir comme ceci:

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

Merci pour votre réponse ... cependant, je suis allé avec la méthode ANSI complète. –