Аудит локальных учетных записей, имя, фамилия, членство в группе и описание

Мне нужно экспортировать результат в файл Excel 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 для получения статуса учетной записи «disabled» или «active», я попал в стену. Кажется, это приводит к значению таким образом, что меня немного удивляет.

Тем не менее, после того, как он выполнил поиск в Google и выяснил, что это может или не может быть достигнуто путем преобразования побитового кода, я начал рассматривать команду Get-WmiObject в PowerShell для объединения значения «отключенного» 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 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}} } . ([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_GroupUser и 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" 

Если вы хотите, чтобы последний вход в качестве значения DateTime вместо строки в формате временной метки WMI, вы можете преобразовать ее следующим образом:

 $nlp = Get-WmiObject -Computer $Comp -Class Win32_NetworkLoginProfile -Filter "Name='$('{0}\\{1}' -f $_.Domain, $_.Name)'" $nlp.ConvertToDateTime($nlp.LastLogon) 
  • Преобразование нескольких xls в csv с помощью powershell
  • Производительность при назначении WorkSheet.UsedRange переменной в PowerShell Excel Automation
  • Вставьте флажок и код VBA в Excel с помощью Powershell
  • Форматирование строк PowerShell: почему символ двоеточия, заставляющий значение моей переменной быть пустым?
  • Powershell - Excel Переименовать базу данных по имени файла
  • Медленная автоматизация Excel?
  • Ошибка Excel workbooks.saveas () в powershell
  • Как сохранить excel 2007 в формате html с помощью powershell?
  • Получение файла не обнаружено, и память не работает при запуске сценария Powershell через java для преобразования PPT, XLS в PPT
  • Последние 8 использованных строк в excel. Powershell
  • «Эта строка уже принадлежит этой таблице» при добавлении данных в таблицу с помощью POWERSHELL
  • Interesting Posts

    Excel игнорирует настройки печати VBA

    Формула для ссылки на данные из сводной таблицы

    Ошибка несоответствия типа при выполнении запроса с десятичным значением в ADODB.Parameter typed adNumeric

    excel vba – удалить ячейку из варианта, основанного на пробеле в другом столбце

    VBA Resizing 2 Identical Изображения с одинаковым размером (ширина и высота)

    добавление / обновление списка с помощью excel vba

    Элементы управления Microsoft Excel ActiveX отключены?

    Экспорт результатов хранимой процедуры в Excel

    Как добавить новую строку в файл Excel с помощью неуправляемого C ++?

    Я получаю ошибку – требуется объект

    Excel Получение плохого текста в результатах столбца – нужно указать номер из десяти цифр из этих ячеек

    Ограничение ячеек определенным порядком ввода определенного диапазона чисел

    Оформить заказ в VBA

    Скопируйте столбец из файла txt в столбец в файле Excel, Python

    Входные данные в следующую доступную строку Excel C #

    Давайте будем гением компьютера.