Используя скрипт PowerShell, приведенный ниже, как проверить действительность SSL-сертификата? - PullRequest
0 голосов
/ 20 ноября 2018

Мне нужно изменить приведенный ниже скрипт, чтобы я мог получить список сервера AD, а затем проверить наличие любого SSL-сертификата, который находится на сервере, на его действительность.

Примечание. Сервер может запускать или не запускать IIS, поэтому я не уверен, как это сделать правильно.

$ComputerName = Get-ADComputer -Filter {Enabled -eq $True} -SearchBase "OU=Servers,OU=Production,DC=Domain,DC=com"
[CmdletBinding()]
param(
    [parameter(Mandatory, ValueFromPipeline)][string[]]$ComputerName,
    [int]$TCPPort = 443,
    [int]$Timeoutms = 3000
)

process {
    foreach ($computer in $computerName) {
        $port = $TCPPort
        write-verbose "$computer`: Connecting on port $port"
        [Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
        $req = [Net.HttpWebRequest]::Create("https://$computer`:$port/")
        $req.Timeout = $Timeoutms
        try {$req.GetResponse() | Out-Null} catch {write-error "Couldn't connect to $computer on port $port"; continue}
        if (!($req.ServicePoint.Certificate)) {write-error "No Certificate returned on $computer"; continue}
        $certinfo = $req.ServicePoint.Certificate

        $returnobj = [ordered]@{
            ComputerName = $computer;
            Port         = $port;
            Subject      = $certinfo.Subject;
            Thumbprint   = $certinfo.GetCertHashString();
            Issuer       = $certinfo.Issuer;
            SerialNumber = $certinfo.GetSerialNumberString();
            Issued       = [DateTime]$certinfo.GetEffectiveDateString();
            Expires      = [DateTime]$certinfo.GetExpirationDateString();
        }

        new-object PSCustomObject -Property $returnobj
    }
}

1 Ответ

0 голосов
/ 20 ноября 2018

Я не уверен, что вы забыли поставить экземпляр функции поверх или нет, но следующий формат должен быть правильным для расширенной функции в PowerShell. Для параметра $ ComputerName можно также указать значение по умолчанию с помощью командлета Get-ADComputer . Попробуйте, чтобы убедиться, что это работает.

function Get-ADComputerCert {
    [CmdletBinding()]
    param(
        [int]$TCPPort = 443,
        [int]$Timeoutms = 3000
    )

    process {
        $ComputerName = (Get-ADComputer -Filter {Enabled -eq $True} -SearchBase "OU=Servers,OU=Production,DC=Domain,DC=com").Name
        foreach ($computer in $computerName) {
            $port = $TCPPort
            write-verbose "$computer`: Connecting on port $port"
            [Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
            $req = [Net.HttpWebRequest]::Create("https://$computer`:$port/")
            $req.Timeout = $Timeoutms
            try {$req.GetResponse() | Out-Null} catch {write-error "Couldn't connect to $computer on port $port"; continue}
            if (!($req.ServicePoint.Certificate)) {write-error "No Certificate returned on $computer"; continue}
            $certinfo = $req.ServicePoint.Certificate

            $returnobj = [ordered]@{
                ComputerName = $computer;
                Port         = $port;
                Subject      = $certinfo.Subject;
                Thumbprint   = $certinfo.GetCertHashString();
                Issuer       = $certinfo.Issuer;
                SerialNumber = $certinfo.GetSerialNumberString();
                Issued       = [DateTime]$certinfo.GetEffectiveDateString();
                Expires      = [DateTime]$certinfo.GetExpirationDateString();
            }

            new-object PSCustomObject -Property $returnobj
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...