Powershell извлекает сертификат по Thumbprint как строковая или строковая переменная - PullRequest
2 голосов
/ 06 марта 2019

Я пытаюсь собрать воедино некоторый код PowerShell, чтобы пройтись по списку серверов, вернуть некоторую информацию, касающуюся их сайтов и привязок IIS, и, если у них есть привязка https, получить certificateHash и использовать, чтобы найти сертификат по отпечатку пальца и верните дату истечения срока действия.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я запускаю свой код ниже $ binding.cerficateHash, кажется, возвращает то, что я ожидал, строку сертификата Hash, но когда я использую это свойство certificateHash, чтобы попытаться получить сертификат его отпечаток большого пальца, это не работает ... но когда я беру необработанное строковое значение значения certificateHash и жестко его кодирую, оно работает ...

Я проверил CertificateHash.GetType (), и он, кажется, просто строка, поэтому я не понимаю, что я делаю не так, и я пробовал несколько вещей, но безрезультатно, учитывая, что это мой первый взлом на PowerShell, так что есть много, я не знаю.

$sites = Invoke-Command  -ComputerName $serverName { Import-Module WebAdministration; Get-ChildItem -path IIS:\Sites }  -ErrorAction SilentlyContinue 

foreach($site in $sites)
{
   $serverName
   $site.name
   $site.physicalPath

   foreach($binding in $site.bindings.Collection)
   {
        $binding.protocol 
        $binding.bindingInformation 
        $binding.certificateHash 
        $binding.certificateStoreName

        if($binding.certificateHash)
        {
            # This outputs AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
            $binding.certificateHash 

            # this retrieves a cert and returns its expiration date, Woohooo!
            Start-Job  Invoke-Command -ComputerName  $serverName -ScriptBlock  { (Get-ChildItem -path Cert:\LocalMachine\WebHosting | Where-Object {$_.Thumbprint -eq "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" })[0].GetExpirationDateString() }         

            # this does not find a cert, and ive tried many things, and no dice.
            Start-Job  Invoke-Command -ComputerName  $serverName -ScriptBlock  { (Get-ChildItem -path Cert:\LocalMachine\WebHosting | Where-Object {$_.Thumbprint -eq $binding.certificateHash })[0].GetExpirationDateString() }                        

            # i've tried extracting the hash via "tostring" and using that, no dice
            $hash = $binding.certificateHash.ToString() 
            Start-Job  Invoke-Command -ComputerName  $serverName -ScriptBlock  { (Get-ChildItem -path Cert:\LocalMachine\WebHosting | Where-Object {$_.Thumbprint -eq $hash })[0].GetExpirationDateString() }                       

            # i've tried adding some wildcards and using the -like operator, no dice.
            $hash = "*" + $binding.certificateHash + "*" 
            Start-Job  Invoke-Command -ComputerName  $serverName -ScriptBlock  { (Get-ChildItem -path Cert:\LocalMachine\WebHosting | Where-Object {$_.Thumbprint -lilke $hash })[0].GetExpirationDateString() }                                    
        }
   }      
}

Пример вывода для сайта.

  • Site1
  • D: \ Apps \ site1
  • HTTP
  • *: 80: Site1-test.ourdomain.com
  • 1019 * HTTPS *
  • *: 443: Site1-test.ourdomain.com
  • АААААААААААААААААААААААААААААААААААААААА
  • WebHosting

1 Ответ

2 голосов
/ 06 марта 2019

Компьютер, на котором вы вызываете блок скриптов, не знает о переменной $binding в вашем локальном сеансе. (Именно поэтому он работает при передаче литеральной строки.)

Попробуйте передать значение в качестве аргумента:

Invoke-Command -Computer $serverName -Script {
   param ($hash)
   (gci Cert:\LocalMachine\WebHosting | ? Thumbprint -eq $hash)[0].GetExpirationDateString()
} -Arg $binding.certificateHash
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...