2016-01-15 4 views
0

При попытке создать файл CSV с информацией о сертификатах у меня есть проблема сохранения пользовательских прав в закрытом ключе.Как преобразовать объект массива в строковый объект в PowerShell?

Проблема в том, что я хочу хранить несколько значений в одном атрибуте, поэтому я использую массив. Сначала у меня не было никаких ошибок, однако столбец в моем csv-файле оставался пустым даже в том случае, когда массив имеет значение.

С простым Write-Host я вижу, что мой массив имеет ожидаемое значение, поэтому эта часть работает нормально.

Для дальнейших исследований я добавил строку:

Get-Member $certs.GetValue("UserRights") 

Это дает ошибку, указывающий я должен преобразовать свою переменную в строку-переменной.

enter image description here

Так что в следующий я попытался преобразовать этот массив в одну строку. Я пробовал несколько способов, но моя ошибка не исчезает, поэтому она не работает. Под моим полным кодом с некоторыми прежними попытками прокомментировано.

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 
+0

'GetValue' является индекс сбруя,' $ certs.GetValue (0) 'так же, как' $ [сертификаты 0] '. Что вы пытаетесь выполнить с помощью 'Get-Member $ certs.GetValue ('UserRights')'? –

+0

Возможно, попробуйте просто «Get-Member $ certs.UserRights» –

+0

Если вы хотите сохранить элементы данных только из прав пользователя, контейнера секретного ключа или всего сертификата в CSV-файле, то вы определенно не хотите 'получить-member'. 'gm' дает информацию о типе аргумента, который не нужен, если вы уже знаете, что вы сохраняете. Неясно, что происходит. Не могли бы вы обновить сообщение и предоставить информацию, особенно сообщения об ошибках? Наконец, если вы инициализируете '$ UserRechten' как пустую строку, то ваш цикл foreach предоставит конкатенированную строку права пользователя, и вам не понадобится код' -join'. –

ответ

0

Как было отмечено в комментариях, Get-Member, вероятно, не то, что вы ищете

Вы (почти наверняка) не хотят, чтобы добавить свойство UserRights члена в $Certs массива, а скорее отдельные объекты в $Certs.

(я удалил кучу лишних Write-Host заявлений для удобства чтения):

$CertsAmended = foreach($Certificate in $certs) 
{ 
    if($certificate.HasPrivateKey) 
    { 
     $rsaFile = $certificate.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName 
     $fullPath = "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\" + $rsaFile 
     $acl = Get-Acl -Path $fullPath 

     # Create the UserRights value using -join 
     $UserRechten = @(foreach($accessrule in $acl.Access){ 
      Write-Host "User" $accessrule.IdentityReference "has the following rights:" $accessrule.FileSystemRights 
      "{0}:{1}" -f ($accessrule.IdentityReference,$accessrule.FileSystemRights) 
     }) -join ";" 

     # Add the property to the individual object 
     $Certificate | Add-Member -MemberType NoteProperty -Name "UserRights" -Value $UserRechten 

     Write-Host "Userrights: " $UserRechten 

     # "Drop" the certificate object (now with a UserRights value) back onto the pipeline 
     $Certificate 
    } 
} 

Теперь вы можете экспортировать $CertsAmended массив CSV все, что вы хотите


Если вы нашли $var = @(foreach($item in $collection){}) -join ';' неугодны глазу, разбить его на два утверждения:

$UserRechten = foreach($accessrule in $acl.Access) 
{ 
    # Create UserRight string here, without ; 
} 
$UserRechten = $UserRechten -join ';' 

Для переменной $fullPath, вы можете использовать команду: Join-Path

$fullPath = Join-Path "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\" $rsaFile 
+0

Спасибо, это работает. Единственная странная вещь: команда Get-Member $ certs.UserRights не дает результата: Свойство 'UserRights' не найдено на этом объекте.Убедитесь, что он существует. –

+0

Потому что это не так. Он существует как свойство для каждого из объектов * внутри * '$ certs', но не для' $ certs'. Попробуйте '$ certs | Get-Member -Name UserRights' –

+0

двойной проводки. –

Смежные вопросы