8000 Get-CertificateData.ps1 · Issue #1 · ViPiC-Ru/admin.tools · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Get-CertificateData.ps1 #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
scriptingstudio opened this issue Dec 30, 2022 · 1 comment
Open

Get-CertificateData.ps1 #1

scriptingstudio opened this issue Dec 30, 2022 · 1 comment
Labels
good first issue Good for newcomers

Comments

@scriptingstudio
Copy link
scriptingstudio commented Dec 30, 2022

Немного концевой оптимизации. И гораздо быстрее, и красивее. add-member медленный; зачем 100500 раз изменять структуру объекта? Один раз создали и все.

# Последовательно обрабатываем переданные сертификаты
$MaxExpireDays = if ($FixExpire) {500} else {0}
foreach ($CertificateItem in $Certificate) {
    $IssuerData = ConvertTo-HashTable -StringData $CertificateItem.IssuerName.Format($true)
    $SubjectData = ConvertTo-HashTable -StringData $CertificateItem.SubjectName.Format($true)
    $ExtensionData = ConvertTo-HashTable -ExtensionData $CertificateItem.Extensions
    $CertificateData = [ordered]@{
        $DataKey          = ''
        "CER-THUMBPRINT"  = $CertificateItem.Thumbprint
        "CER-CREATE"      = $CertificateItem.NotBefore.ToString("dd.MM.yyyy HH:mm:ss")
        "CER-EXPIRE"      = (Repair-Date -BeforeDate $CertificateItem.NotBefore -AfterDate $CertificateItem.NotAfter -MaxDays $MaxExpireDays).ToString("dd.MM.yyyy HH:mm:ss")
        "CER-NAME"      = ''
        # Информация об издателе
        "CER-ISSUER"            = Repair-Name $IssuerData["CN"]
        "CER-ISSUER-DOMAIN"     = $IssuerData["DC"]
        "CER-ISSUER-DEPARTMENT" = $IssuerData["OU"]
        "CER-ISSUER-LOCALITY"   = $IssuerData["L"]
        "CER-ISSUER-EMAIL"      = $IssuerData["E"]
        "CER-ISSUER-INN"        = Repair-Name $IssuerData["ИНН"] -Expanded
        "CER-ISSUER-OGRN"       = Repair-Name $IssuerData["ОГРН"] -Expanded
        "CER-ISSUER-STATE"      = ''
        "CER-ISSUER-COUNTRY"    = ''
        # Информация об субъекте
        "CER-SUBJECT"            = (Repair-Name $SubjectData["CN"])
        "CER-SUBJECT-DOMAIN"     = $SubjectData["DC"]
        "CER-SUBJECT-DEPARTMENT" = $SubjectData["OU"]
        "CER-SUBJECT-LOCALITY"   = $SubjectData["L"]
        "CER-SUBJECT-EMAIL"      = $SubjectData["E"]
        "CER-SUBJECT-EMPLOYEE"   = Repair-Name (Join-Items $SubjectData["SN"], $SubjectData["G"] -NoEmpty)
        "CER-SUBJECT-TITLE"      = $SubjectData["T"]
        "CER-SUBJECT-INN"        = Repair-Name $SubjectData["ИНН ЮЛ"] -Expanded
        "CER-SUBJECT-OGRN"       = Repair-Name $SubjectData["ОГРН"] -Expanded
        # Информация об встроенных лицензиях
        "CER-EMBEDDED-LICENSE"   = Repair-NotEmpty $ExtensionData @{"1.2.643.2.2.49.2" = "КриптоПро CSP"}
    }
    # Информация об сертификате
    if ($DataKey -and $DataValue) {
        $CertificateData[$DataKey] = $DataValue
    } else {$CertificateData.remove($DataKey)} 
    if ($Expanded) {
        $CertificateData["CER-NAME"] = ((Repair-Date -BeforeDate $CertificateItem.NotBefore -AfterDate $CertificateItem.NotAfter -MaxDays $MaxExpireDays).ToString("yyyy.MM.dd") + " #" + $CertificateItem.Thumbprint.Substring($CertificateItem.Thumbprint.Length - 4) + " - " + (Get-FirstItem (Repair-Name (Join-Items $SubjectData["SN"], $SubjectData["G"] -NoEmpty)), (Repair-Name $SubjectData["CN"] -Expanded) -NoEmpty))
    } else {$CertificateData.remove("CER-NAME")}
    # Информация об издателе
    if ($Expanded) {
        $CertificateData["CER-ISSUER-STATE"]   = $IssuerData["S"]
        $CertificateData["CER-ISSUER-COUNTRY"] = $IssuerData["C"]
    } else {
        $CertificateData.remove("CER-ISSUER-STATE")
        $CertificateData.remove("CER-ISSUER-COUNTRY")
    }
    if ($Expanded) {
        $CertificateData["CER-SUBJECT-SNILS"]   = Repair-Name $SubjectData["СНИЛС"] -Expanded
        $CertificateData["CER-SUBJECT-STATE"]   = $SubjectData["S"]
        $CertificateData["CER-SUBJECT-COUNTRY"] = $SubjectData["C"]
    }
    # результат
    if ((-not $DataValue) -and $DataKey) {
        $CertificateData[$DataKey]
    }
    else {
        [pscustomobject]$CertificateData
    }
}

UPDATE

русский язык:
об сертиф 8000 кате => о сертификате
об встроенных лицензиях => о встроенных лицензиях
об субъекте => о субъекте

(но об стол и о столб :-)))

@ViPiC-Ru ViPiC-Ru added the good first issue Good for newcomers label Dec 30, 2022
@scriptingstudio
Copy link
Author
scriptingstudio commented Jan 1, 2023

Еще немного красоты. Убираем промежуточные переменные, промежуточные действия и неоптимальную логику. Больше powershell-way.

function ConvertTo-HashTable {
    # Конвертирует строки в хеш таблицу
    Param (
        [String]$StringData,
        $ExtensionData
    )

    $HashTable = @{}
    if ($StringData) {
        $StringData.Split([Environment]::NewLine) | . { process {
            (ConvertFrom-StringData -StringData $_).GetEnumerator().foreach{
                $key = $_.name
                $value = $_.value.trim('"')
                $HashTable[$Key] = if ($HashTable[$Key]) {
                    switch ($Key) {
                        "DC" { $Value, $HashTable[$Key] -join '.' }
                        "OU" { $HashTable[$Key], $Value -join '\' }
                        default { $HashTable[$Key], $Value -join ' ' }
                    }
                }
                else {$Value} 
            }
        }}
    }
    elseif ($ExtensionData) {
        foreach ($Extension in $ExtensionData) {
            $Value = $Extension.Format($true)
            if (-not $Value) { $Value = $true }
            $HashTable[$Extension.Oid.Value] = $Value
        }
    }
    $HashTable
}

function Repair-Name {
    # Исправляет имена в значениях
    Param (
        [String]$Name = "",
        [Switch]$Expanded
    )

    $Name = $Name -Replace "Общество с ограниченной ответственностью", "ООО"
    $Name = $Name.Replace("_", " ").Replace('"', "")
    if ($Expanded) {
        ($Name -Replace '[,*.]').TrimStart("0")
    } else {$Name}  
}

UPDATE

Можно даже еще сократить на пару строк и 4 скобки

$StringData.Split([Environment]::NewLine).foreach{
    $key,$value = $_.split('=',2).trim()
    $value = $value.trim('"')
    $HashTable[$Key] = if ($HashTable[$Key]) {
        switch ($Key) {
            "DC" { $Value, $HashTable[$_] -join '.' }
            "OU" { $HashTable[$_], $Value -join '\' }
            default { $HashTable[$_], $Value -join ' ' }
        }
    }
    else {$Value} 
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
good first issue Good for newcomers
Projects
None yet
Development

No branches or pull requests

2 participants
0