При попытке создать файл CSV с информацией о сертификатах у меня есть проблема сохранения пользовательских прав в закрытом ключе.Как преобразовать объект массива в строковый объект в PowerShell?
Проблема в том, что я хочу хранить несколько значений в одном атрибуте, поэтому я использую массив. Сначала у меня не было никаких ошибок, однако столбец в моем csv-файле оставался пустым даже в том случае, когда массив имеет значение.
С простым Write-Host я вижу, что мой массив имеет ожидаемое значение, поэтому эта часть работает нормально.
Для дальнейших исследований я добавил строку:
Get-Member $certs.GetValue("UserRights")
Это дает ошибку, указывающий я должен преобразовать свою переменную в строку-переменной.
Так что в следующий я попытался преобразовать этот массив в одну строку. Я пробовал несколько способов, но моя ошибка не исчезает, поэтому она не работает. Под моим полным кодом с некоторыми прежними попытками прокомментировано.
cls $certs = Get-ChildItem cert:\LocalMachine -Recurse | Where-Object {-not $_.PSIsContainer} | Select * Write-Host ("There were {0} certificates" -f ($certs | Measure-Object).Count)
foreach($certificate in $certs) {
if($certificate.HasPrivateKey)
{
Write-Host "Certificate's PSChildName is" $certificate.PSChildName
$rsaFile = $certificate.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName
$fullPath = "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\" + $rsaFile
$acl = Get-Acl -Path $fullPath
foreach($accessrule in $acl.Access)
{
Write-Host "User" $accessrule.IdentityReference "has the following rights:" $accessrule.FileSystemRights
}
Write-Host "------"
$UserRechten = @()
foreach($accessrule in $acl.Access)
{
$UserRechten += "{0}:{1};" -f ($accessrule.IdentityReference,$accessrule.FileSystemRights)
}
Write-Host "================================================================"
# -join $UserRechten
# $Userrechten | out-string
# $UserRechten = [system.String]::Join(" ", $UserRechten)
$separator = ";"
[string]::Join($separator,$UserRechten)
$certs | Add-Member -MemberType NoteProperty -Name "UserRights" -Value $UserRechten -Force
Write-Host "UserRechten has value : "$UserRechten
Get-Member $certs.GetValue("UserRights")
Write-Host "================================================================"
} }
$Certs | Add-Member -MemberType NoteProperty -Name "MachineName" -Value $env:COMPUTERNAME -Force
# $certs | Add-Member -MemberType NoteProperty -Name "Store" -Value 'My' -Force $RunDate = Get-Date -Format 'yyyy-MM-dd' $certs | Add-Member -MemberType NoteProperty -Name "RunDate" -Value $RunDate -Force $certs | Add-Member -MemberType NoteProperty -Name "Owner" -Value $env:USERNAME -Force
$Certs | Select * | Export-Csv c:\Certificaten\LocalCertsAll_$env:COMPUTERNAME.csv
$Certs | Select MachineName, Owner, PSParentPath, DnsNameList, PSChildName, NotBefore, NotAfter, Rundate, EnhancedKeyUsageList, HasPrivateKey, SerialNumber, Issuer, Subject, FriendlyName, UserRigthts |
Export-CSV c:\Certificaten\Localcerts_$env:COMPUTERNAME.csv
'GetValue' является индекс сбруя,' $ certs.GetValue (0) 'так же, как' $ [сертификаты 0] '. Что вы пытаетесь выполнить с помощью 'Get-Member $ certs.GetValue ('UserRights')'? –
Возможно, попробуйте просто «Get-Member $ certs.UserRights» –
Если вы хотите сохранить элементы данных только из прав пользователя, контейнера секретного ключа или всего сертификата в CSV-файле, то вы определенно не хотите 'получить-member'. 'gm' дает информацию о типе аргумента, который не нужен, если вы уже знаете, что вы сохраняете. Неясно, что происходит. Не могли бы вы обновить сообщение и предоставить информацию, особенно сообщения об ошибках? Наконец, если вы инициализируете '$ UserRechten' как пустую строку, то ваш цикл foreach предоставит конкатенированную строку права пользователя, и вам не понадобится код' -join'. –