Справка по сценариям PowerShell — Получить ACL из существующего файла CSV, затем добавить в новый CSV

#powershell

#powershell

Вопрос:

У меня есть файл CSV с именем «C:testingblah.csv » в таком формате:

 "Agent Name","Agent Type","File Name","Location","Added (GMT)","Created (GMT)","Last Modified (GMT)","File Size (Bytes)","File Size","Extension","Incident Type","Flagged","Ignored","Location   File Name"
"Server","file","blah5.txt","\127.0.0.1c$temp","10/8/2020 21:13","10/8/2020 19:33","10/8/2020 16:26","10723331","10.23 (MB)","txt","ssn_medium_data_discover","FALSE","FALSE","\127.0.0.1c$tempblah5.txt"
 

Я хочу запустить команду Powershell «get-acl» в столбце «Местоположение имя файла» в файле blah.csv и вывести ее в новый CSV с владельцем и доступом в качестве новых столбцов. До сих пор мне не очень везло — вот мой код:

 $file2 = import-csv -path "C:testingblah.csv"

ForEach ($file in $file2) {
   get-acl -path $file."Location   File Name" | Select-Object Owner,AccessToString 
    }
 

Можете ли вы направить меня в правильном направлении? Конечный результат должен содержать все столбцы в исходном csv с двумя новыми столбцами (Owner, AccessToString), которые заполняются значениями из get-acl.

Ответ №1:

С Import-Csv помощью командлета вы получаете массив PSCutomObject, поэтому к ним легко добавить некоторые свойства, а затем повторно экспортировать в новый csv :

 $file2 = Import-Csv -Path "C:testingblah.csv"

ForEach ($file in $file2) {
   $infoSec = Get-Acl -Path $file."Location   File Name" | Select-Object Owner, AccessToString 
   $file | Add-Member -MemberType NoteProperty -Name "Owner" -Value $infoSec.Owner
   $file | Add-Member -MemberType NoteProperty -Name "AccessToString" -Value $infoSec.AccessToString
   $file | Export-Csv -Path C:testingnewBlah.csv -Encoding UTF8 -NoTypeInformation -Append
}
 

Но, если вы можете, вам следует избегать использования имен свойств с пробелами, например :

 "AgentName","AgentType","FileName","Location","AddedGMT","CreatedGMT","ModifiedGMT","FileSizeBytes","FileSize","Extension","IncidentType","Flagged","Ignored","FullName"
 

таким образом, вы можете заменить Get-Acl строку на :

 $infoSec = Get-Acl -Path $file.FullName | Select-Object Owner, AccessToString