Get-BitlockerVolume Uniqe行ID的多个因子

时间:2018-06-06 10:03:35

标签: arrays powershell csv formatting

我发现了https://itpro.outsidesys.com/2017/10/21/powershell-change-values-in-csv-data/

我想用它来制作一个更新的CSV,并且没有两次相同的条目。 Get-BitlockerVolume没有唯一的行数据,所以我可以使用2个页眉/行数据来表示这是ROW1,这是ROW2等。

喜欢使用标题ComputerNameMountpoint中的日期(由于某些PC有一个以上的分区,因此可以多次出现Computername,MountPoint是驱动器号,我想使用这2个信息来识别行。 这可能吗?

#Get all AD Computers ATNB*
$cn = Get-ADComputer -Filter * | Where-Object {$_.Name -like "ATNB*"} | Select -Property Name
foreach ($pc in $cn.name){

#Test connection
        $connection = test-connection -buffersize 32 -count 1 -ComputerName $pc -quiet

    if ($connection -eq $True) {
            #Run command on pc esport to csv add new row
            invoke-command -computername $cn.name -scriptblock {get-bitlockervolume} | export-csv -Append "C:\_test\New folder\bitlockercheck.csv"
            echo "$pc Info added to CSV"
    }
    else {echo "$pc is not online"}
}

这是新的/更新的脚本:

$csv = @(Import-Csv "C:\_test\New folder\bvt_2.csv")

#Get all AD Computers ATNB* and start looping
Get-ADComputer -Filter { Name -like "ATNB*" } | ForEach-Object {
    # Assign the "Name" value of the current computer to $pc
    $pc = $_.Name

    # Test connection
    if (Test-Connection -buffersize 32 -count 1 -ComputerName $pc -quiet) {
        #Run command on pc esport to csv add new row
        Invoke-Command -Computername $pc -scriptblock { Get-BitlockerVolume } | ForEach-Object {
            # For each bit locker volume...
            $volume = $_

            # ... see if a row exists for the volume
            $csvRow = $csv | Where-Object { $_.ComputerName -eq $pc -and $_.MountPoint -eq $volume.MountPoint }

            # if a row exists, update the Data column only
            if ($csvRow) {
                $csvRow.Data = $volume.Data
                echo "$pc Info updated in CSV"
            } else {
                # Otherwise add a new row to the CSV
                $csv += [PSCustomObject]@{
                    ComputerName = $pc
                    MountPoint   = $volume.MountPoint
                    Data         = $volume.Data
                }
                echo "$pc Info added to CSV"
            }
        }
    } else {
        echo "$pc is not online"
    }
}

# Export the updated CSV file
$csv | Export-Csv "C:\_test\New folder\bvt_2.csv" -NoTypeInformation

1 个答案:

答案 0 :(得分:0)

由于您使用PSComputerNameInvoke-Command可用作额外属性,因此您可以将其用作唯一键。

当您可以访问计算机并列出其BitLockerVolumes时,您将获得完整列表。您基本上想要从CSV文件中删除所有该计算机的卷并添加新列表。

现在我要做的是

  • 从所有在线计算机收集所有BitLockerVolume对象
  • 从PSComputerName
  • 创建一个唯一的字符串数组
  • 导入缓存的CSV文件,过滤掉在此数组中具有其计算机名称的所有对象
  • 从缓存数据+当前数据创建新列表并覆盖CSV文件

所以,按照以下方式:

$CSV_PATH = "C:\_test\New folder\bitlockercheck.csv"

$current_data = Get-ADComputer -Filter 'Name -like "ATNB*"' | Foreach-Object {
    if (Test-Connection $_.Name -BufferSize 32 -Count 1 -Quiet) {
        Invoke-Command -ComputerName $_.Name -ScriptBlock {Get-BitLockerVolume}
    }
}

$computernames = $current_data | Select-Object -ExpandProperty PSComputerName -Unique

$cached_data = Import-Csv $CSV_PATH | Where-Object {
    -not ($computernames -contains $_.PSComputerName)
}

$cached_data + $current_data | Export-Csv $CSV_PATH

您绝对应该在AD服务器上进行过滤。您目前的方式是先将所有 AD计算机下载到您的计算机上,然后立即将其中的大部分计算机丢弃。通过将过滤字符串传递给Get-ADComputer,您将只获得您感兴趣的对象,这样效率会更高。