Как я могу удалить двоеточие из вывода NoteProperty?

#windows #powershell #registry

#Windows #powershell #реестр

Вопрос:

Я пишу сценарий в PowerShell для автоматизации проверки базовых параметров безопасности в нашей среде Windows Server и вывода его в текстовый файл в определенном формате, необходимом для нашей системы продажи билетов (ServiceNow). У меня это почти идеально, но когда я вывожу значения NoteProperty PSObject, он вводит двоеточие между данными, которые мне нужны. Я не хочу удалять двоеточия из текстового файла, поскольку в другом месте используются временные метки и двоеточия, которые необходимы для форматирования. Возможно ли удалить двоеточие из текстового вывода NoteProperty?

Ниже приведен сценарий, который я написал:

 $OutputFile = "C:Tempoutputfile.txt"
Remove-Item -Path $OutputFile -Force
$ServerList = Get-Content "C:Temptest.txt"
$ScriptName = $MyInvocation.MyCommand.Name
$Date = Get-Date
$Preamble = @"
---
Generated: $Date
Script: $ScriptName
---


Systems in scope
----------------
$($ServerList | Out-String)

Reports per server
------------------

"@ | Out-File $OutputFile

foreach ($Server in $ServerList)
{
  $reg1 = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine", $Server)
  $key1 = "SYSTEMCurrentControlSetserviceseventlog"
  $key2 = "SYSTEMCurrentControlSetservicesSamSs"
  $key3 = "SYSTEMCurrentControlSetservicesMpsSvc"
  $key4 = "SYSTEMCurrentControlSetservicesW32Time"
  $key5 = "SoftwareMicrosoftWindows NTCurrentVersionSetupRecoveryConsole"
  $key6 = "SystemCurrentControlSetControlLsaMSV1_0"
  $key7 = "SoftwareMicrosoftWindows NTCurrentVersionWinlogon"
  $key8 = "SoftwareMicrosoftWindows NTCurrentVersionSetupRecoveryConsole"
  $key9 = "SystemCurrentControlSetControlLsa"
  $key10 = "SoftwareMicrosoftWindowsCurrentVersionPoliciesSystem"
  $regkey1 = $reg1.opensubkey($key1)
  $regkey2 = $reg1.opensubkey($key2)
  $regkey3 = $reg1.opensubkey($key3)
  $regkey4 = $reg1.opensubkey($key4)
  $regkey5 = $reg1.opensubkey($key5)
  $regkey6 = $reg1.opensubkey($key6)
  $regkey7 = $reg1.opensubkey($key7)
  $regkey8 = $reg1.opensubkey($key8)
  $regkey9 = $reg1.opensubkey($key9)
  $regkey10 = $reg1.opensubkey($key10)
  $keyValue1 = $regKey1.GetValue('Start')
  $keyValue2 = $regKey2.GetValue('Start')
  $keyValue3 = $regKey3.GetValue('Start')
  $keyValue4 = $regKey4.GetValue('Start')
  $keyValue5 = $regKey5.GetValue('setcommand')
  $keyValue6 = $regKey6.GetValue('allownullsessionfallback')
  $keyValue7 = $regKey7.GetValue('AllocateDASD')
  $keyValue8 = $regKey8.GetValue('securitylevel')
  $keyValue9 = $regKey9.GetValue('TurnOffAnonymousBlock')
  $keyValue10 = $regKey10.GetValue('DontDisplayLockedUserId')

  if ($keyvalue1 -ne 2) {$keyvalue1 = "NOK"} else {$keyvalue1 = "OK"} 

  Write-Output "Server Name : $Server" | Out-File $OutputFile -Append
  Write-Output "Date Generated : $Date"  | Out-File $OutputFile -Append

  $TXT = New-Object PSObject
  $TXT | Add-Member NoteProperty "5.1 - Set Windows Event Log to 'Automatic'" "$keyvalue1"
  $TXT | Add-Member NoteProperty "5.2 - Set Security Accounts Manager to 'Automatic'" $keyvalue2
  $TXT | Add-Member NoteProperty "5.3 - Set Windows Firewall to 'Disabled'" $keyvalue3
  $TXT | Add-Member NoteProperty "5.4 - Set Windows time to Automatic" $keyvalue4
  $TXT | Add-Member NoteProperty "6.1 - Set 'Recovery Console: Allow Floppy Copy and Access to All Drivers and All Folders' to 'Disabled'" $keyvalue5
  $TXT | Add-Member NoteProperty "6.2 - Set 'Network Security: Allow LocalSystem NULL Session Fallback' to 'Disabled'" $keyvalue6
  $TXT | Add-Member NoteProperty "6.3 - Set 'Devices: Allowed to Format and Eject Removable Media' to 'Administrators'" $keyvalue7
  $TXT | Add-Member NoteProperty "6.4 - Set 'Recovery Console: Allow Automatic Administrative Logon' to 'Disabled'" $keyvalue8
  $TXT | Add-Member NoteProperty "6.5 - Set 'Network Access: Allow Anonymous SID/Name Translation' to 'Disabled'" $keyvalue9
  $TXT | Add-Member NoteProperty "6.6 - Configure 'Interactive Logon: Display User Information When the Session is Locked'" $keyvalue10
  $TXT | Out-File $OutputFile -Append
}
  

Который затем создает вывод следующего текстового файла:

---
Сгенерировано: 04.10.2016 11:16:09
Сценарий: проверка базовой линии - Версия Notepad.ps1
---


Системы в области видимости
----------------
Тестовый сервер


Отчеты для каждого сервера
------------------

Имя сервера: TestServer
Дата создания: 04.10.2016 11:16:09


5.1 - Установите для журнала событий Windows значение "Автоматический": ОК
5.2 - Установите для диспетчера учетных записей безопасности значение "Автоматический": 2
5.3 - Установите для брандмауэра Windows значение "Отключено": 2
5.4 - Установите время Windows на автоматическое: 3
6.1 - Установите для "Консоль восстановления: разрешить копирование на дискету и доступ ко всем драйверам и всем папкам" значение "Отключено": 0
6.2 - Установите "Сетевая безопасность: разрешить резервный вариант нулевого сеанса LocalSystem" на "Отключено" :
6.3 - Установите "Устройства: разрешено форматировать и извлекать съемные носители" на "Администраторы" :
6.4 - Установите для "Консоль восстановления: разрешить автоматический вход с правами администратора" значение "Отключено": 0
6.5 - Установите для "Доступ к сети: разрешить анонимный перевод SID / имени" значение "Отключено" :
6.6 - Настройка "Интерактивный вход в систему: отображение информации о пользователе при блокировке сеанса" :

Мне просто нужно, чтобы двоеточия между проверкой реестра и статусом (OK) исчезли. Сценарий еще не завершен, так как к тому времени, когда я закончу, все значения будут либо читать OK, либо NOK. Просто хотел разобраться с этим, прежде чем продолжить.

Ответ №1:

Двоеточия вставляются, потому что вы создаете объект с более чем 4 свойствами и выводите этот объект. PowerShell автоматически отображает это в формате списка (так же, как если бы вы это делали $TXT | Format-List ).

Если вы просто хотите добавить форматированный текст в файл, не утруждайте себя созданием объекта. Используйте это вместо:

 @"
5.1 - Set Windows Event Log to 'Automatic'                                                              $keyvalue1
5.2 - Set Security Accounts Manager to 'Automatic'                                                      $keyvalue2
5.3 - Set Windows Firewall to 'Disabled'                                                                $keyvalue3
5.4 - Set Windows time to Automatic                                                                     $keyvalue4
6.1 - Set 'Recovery Console: Allow Floppy Copy and Access to All Drivers and All Folders' to 'Disabled' $keyvalue5
6.2 - Set 'Network Security: Allow LocalSystem NULL Session Fallback' to 'Disabled'                     $keyvalue6
6.3 - Set 'Devices: Allowed to Format and Eject Removable Media' to 'Administrators'                    $keyvalue7
6.4 - Set 'Recovery Console: Allow Automatic Administrative Logon' to 'Disabled'                        $keyvalue8
6.5 - Set 'Network Access: Allow Anonymous SID/Name Translation' to 'Disabled'                          $keyvalue9
6.6 - Configure 'Interactive Logon: Display User Information When the Session is Locked'                $keyvalue10
"@ | Out-File $OutputFile -Append
  

Если вам требуется более детальный контроль над форматом вывода, рассмотрите возможность использования format operator ( -f ) .

Комментарии:

1. Это смотрело мне прямо в лицо. Я даже использовал его в преамбуле и никогда не думал адаптировать его для нижней части. Большое вам спасибо!!