Get-BitlockerVolume Несколько факторов для идентификатора строки Uniqe - PullRequest
0 голосов
/ 06 июня 2018

Я нашел это https://itpro.outsidesys.com/2017/10/21/powershell-change-values-in-csv-data/

Я хотел бы использовать его для создания CSV, который обновляется и не имеет одну и ту же запись дважды.Get-BitlockerVolume не имеет уникальных данных строк, поэтому есть способ, с помощью которого я могу использовать 2 заголовка / данные строки, чтобы сказать, что это ROW1, это ROW2 и т. Д.

Как и использование даты из заголовка ComputerNameи Mountpoint (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 голосов
/ 06 июня 2018

Поскольку у вас есть PSComputerName в качестве дополнительного свойства, когда вы используете Invoke-Command, вы можете использовать его как уникальный ключ.

Когда вы можете добраться до компьютера и отобразить его BitLockerVolumes, вы получите полный список.По сути, вы хотите удалить все тома этого компьютера из файла CSV и добавить новый список.

Теперь я должен сделать

  • собрать всеОбъекты BitLockerVolume со всех подключенных компьютеров
  • создают уникальный массив строк из PSComputerName
  • , импортируют кэшированный CSV-файл, отфильтровывая все объекты, у которых есть имя компьютера в этом массиве
  • makeновый список из кэшированных данных + текущие данные и перезаписать файл 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, вы получите только те объекты, которые вас интересуют, что гораздо эффективнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...