#powershell
#powershell
Вопрос:
Я создаю несколько сценариев PS, чтобы помочь автоматизировать некоторые задачи, которые у меня есть. Для запуска этих сценариев мне нужны подписанные файлы. Итак, я пошел по пути создания самоподписывающегося сертификата, и я хотел сделать сценарий немного более надежным, если не перестарался. Я всегда могу вернуться к первой итерации и двигаться дальше, но это так озадачивает меня, мне нужно выяснить, почему это происходит.
пароль и хэши не имеют значения, и я меняю хэши при каждом запуске. Я планирую удалить все поврежденные сертификаты, как только смогу выполнить чистую проверку.
вывод на консоль:
certpath: Cert:\LocalMachineMy365B361A71F306681B432CE0B9CFCA7327890F47
before exiting makeCert cert[all] 365B361A71F306681B432CE0B9CFCA7327890F47
before exiting makeCert cert[0] 365B361A71F306681B432CE0B9CFCA7327890F47
before exiting makeCert cert[1]
after exiting makeCert cert[all] C:selfcert1.pfx 365B361A71F306681B432CE0B9CFCA7327890F47
after exiting makeCert cert[0] C:selfcert1.pfx
after exiting makeCert cert[1] 365B361A71F306681B432CE0B9CFCA7327890F47
this is cert Cert:\LocalMachineMyC:selfcert1.pfx 365B361A71F306681B432CE0B9CFCA7327890F47
function makeCert {
param
(
[string] $pass
)
write-host "creating cert" -ForegroundColor Yellow
#generate a new cert, dnsname should be your FQDN
$cert = New-SelfSignedCertificate -CertStoreLocation $certStore -dnsname "$env:computername.$env:userdnsdomain" -Type CodeSigningCert -FriendlyName "MyCodeSigningCert"
write-host $cert -ForegroundColor Red
write-host $cert.Thumbprint -ForegroundColor Red
$password = ConvertTo-SecureString -String $pass -Force -AsPlainText
#define the certpath and export the pfx file, if it needs to be shared.
$certPath = "$certStore$($cert.Thumbprint)"
Export-PfxCertificate -Cert $certPath -FilePath C:selfcert1.pfx -Password $password -Force
write-host "cert created" -ForegroundColor Green
write-host "certpath:"$certPath
write-host "before exiting makeCert cert[all]"$cert.Thumbprint
write-host "before exiting makeCert cert[0]"$cert[0].Thumbprint
write-host "before exiting makeCert cert[1]"$cert[1].Thumbprint
return ($cert.Thumbprint)
# return ($cert[0].Thumbprint) referencing the list item with 0 or 1 makes no difference.
}
function main {
param
(
[int] $i
)
$password = "passw0rd!"
$certTP = checkCert
if ($certTP)
{
write-host "Cert found" -ForegroundColor Green
}
else
{
write-host "No matching code signing cert. Creating new cert" -ForegroundColor Yellow
write-host "before making cert"$certTP -ForegroundColor Yellow
$certTP = makeCert -pass $password
write-host "after exiting makeCert cert[all]"$certTP -ForegroundColor Yellow
write-host "after exiting makeCert cert[0]"$certTP[0] -ForegroundColor Yellow
write-host "after exiting makeCert cert[1]"$certTP[1] -ForegroundColor Yellow
#importCert -pass $password
}
if ($i = 1) {
certSigning -cert "$certStore$certTP"
}
}
main -i 0
Ответ №1:
ну, теперь я чувствую себя довольно глупо. Я понял, откуда возникла проблема внутри функции, но я не прибегал к сохранению вызова экспорта в переменную. В тот момент, когда я это сделал, было возвращено ожидаемое значение.
Большая часть меня хочет удалить это, но я бы предпочел этого не делать, в надежде, что это поможет кому-то еще.
Этот пост — это то, что привело меня к ответу: https://community.idera.com/database-tools/powershell/ask_the_experts/f/learn_powershell-12/5412/tip—watch-out-return-values-from-functions-in-power-shell
Итак, две вещи, чтобы избежать искажения возвращаемых данных из функций
- Не забудьте удалить все строки, в которых вы ввели переменные, чтобы увидеть их значение
2. Не забывайте назначать выходные данные из вызовов функций в функции переменным
Как новичок powershell, я усвоил это на собственном горьком опыте