Задать вопрос
@hixr0k

Как решить проблему с выводом значений из реестра через Invoke-Command?

День добрый. Есть скрипт при помощи которого из реестра пытаюсь выводить ключи лицензий от КриптоПро(FIND_CRYPTOPRO_KEY) и КриптоАРМ(FIND_CRYPTOARM_KEY) на удаленных ПК.
Скрипт
$compname = 'AST' 
$cripto5 = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\08F19F05793DC7340B8C2621D83E5BE5\InstallProperties' 
$cripto4 = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\7AB5E7046046FB044ACD63458B5F481C\InstallProperties'
$kriptoarm = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Digt\Trusted Desktop\License' 


Write-Output FIND_CRYPTOARM:(Invoke-Command -ComputerName $compname -ScriptBlock { Test-Path -Path $using:kriptoarm })
Write-Output FIND_CRYPTOPRO4:(Invoke-Command -ComputerName $compname -ScriptBlock { Test-Path -Path $using:cripto4 })   
Write-Output FIND_CRYPTOPRO5:(Invoke-Command -ComputerName $compname -ScriptBlock { Test-Path -Path $using:cripto5 }) 

Write-Output FIND_CRYPTOPRO_KEY
if (Invoke-Command -ComputerName $compname -ScriptBlock { Test-Path -Path $using:cripto5 }) { 
    Invoke-Command -ComputerName $compname  -ScriptBlock { Get-ItemProperty -Path $using:cripto5 -Name ProductID } | Select-Object "ProductID"  
}
elseif (Invoke-Command -ComputerName $compname -ScriptBlock { Test-Path -Path $using:cripto4 }) { 
    Invoke-Command -ComputerName $compname  -ScriptBlock { Get-ItemProperty -Path $using:cripto4 -Name ProductID } | Select-Object "ProductID"  
}
else {
    Write-Output CryptoPro not found
}

Write-Output ([System.Environment]::NewLine)
Write-Output FIND_CRYPTOARM_KEY
if (Invoke-Command -ComputerName $compname -ScriptBlock { Test-Path -Path $using:kriptoarm }) { 
    Invoke-Command -ComputerName $compname  -ScriptBlock { Get-ItemProperty -Path $using:kriptoarm -Name SerialNumber } | Select-Object "SerialNumber"  
}
else {
    Write-Output CryptoARM not found
}


Но столкнулся с проблемой, при отработке скрипта отображается только ключ от КриптоАРМ, а ключ КриптоПро не отображается. Но как мне кажется ключ от КриптоПРО всё же находится
60c47d48ecb13995249248.png
После того как изменил скрипт и сначала поставил поиск ключа КриптоПро, а потом КриптоАРМ, ситуация стала противоположной. Стал отображаться ключ КриптоПРО, а ключ КриптоАРМ - нет.
60c47f4bf021d950385245.png

Не могу понять в чём проблема.
  • Вопрос задан
  • 161 просмотр
Подписаться 1 Простой Комментировать
Решения вопроса 1
@MaxKozlov Куратор тега PowerShell
Проще один раз всё загнать в один вызов.
Так и работать будет в разы быстрее и запустить можно одновременно на несколько компов, только в вывод надо имя компа включить

invoke-command -comp $comp {
  # а здесь все красоты
  # причём циклом
  $source @(
    @{ key name= '''; valuename=''},
    @{ key name= '''; valuename=''}
  )
  foreach ($src in $source) {
    get-itemproperty -path $src.keyname | select -expandproperty $src.valuename
  }
}

test опустил...
Проблема у вас в select-object

стандартный вызов, если он со свойствами, пытается подстроить последующий вывод под предыдущие возвращённые свойства. если вы вначале просите свойство "ProductID", то и в последующем вызове PS ждёт свойство ProductID, которого нет, вы подсовываете ему "SerialNumber"

Для этого в моём варианте используется параметр ExpandProperty, который превращает объект в строку
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
SignFinder
@SignFinder
Wintel\Unix Engineer\DevOps
Выполняйте скрипт поблочно - проверяйте, что каждый блок делает то, что вам нужно.
Ответ написан
Комментировать
@AAT666
Тоже бывают такие глюки.
Либо вывод icm в переменную, либо через write-output.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы