Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 审核本地帐户状态、名称、全名、集团成员和;描述_Excel_Powershell_Csv_Bitwise Operators_Adsi - Fatal编程技术网

Excel 审核本地帐户状态、名称、全名、集团成员和;描述

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

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

我知道这个脚本是为了查询
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方法。