Дамп подключенных дисков серийников и пользователей - PullRequest
0 голосов
/ 03 октября 2018

Мне нужно перечислить пользователей подключенного диска и его серийного номера в выходном файле.Я буду подключать между 12-24 дисками в массивах одновременно.Я хотел бы иметь возможность поместить назначенные буквы дисков в переменную.И затем иметь весь цикл скриптов для каждого подключенного диска.дамп последовательного порта + связывание его с пользователями этого диска в выходном файле CSV

Как я могу поместить назначенные буквы диска в массив?

$(get-physicaldisk; get-childitem -path (array variable):\Users) | add-content C:\path\to\my\output.csv

почти получает нужный мне результат, когдаЯ пробую это на одном диске.Но мне бы очень хотелось очистить его и отображать только важную информацию (PSChildName), исключая все стандартные общедоступные учетные записи администратора, чтобы уменьшить дублирование ненужной информации.

Я хотел, чтобы это работало

$(get-physicaldisk | select-object FriendlyName, SerialNumber)-$(get-childitem -path L:\Users| select-object PSChildName)

, но это не

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

Для каждого диска в массиве - вывод ((serial #) + (пользователи на диске)), внося поправки в мой .csv

После долгих пробок и пыхтений я сейчас здесь, спасибо всем за помощь

function Get-UsersOnDrive([string[]]$DriveLetters){
     if (!$DriveLetters){
         $DriveLetters = Get-WmiObject Win32_Logicaldisk | %{$_.Name -replace ":", ""}
     }

     foreach($DriveLetter in $DriveLetters)
        {
         $SerialNumber =  get-partition -DriveLetter $DriveLetter -ErrorAction Ignore | get-disk | select -ExpandProperty SerialNumber
         $path = $DriveLetter + ":\Users"
         $Users = get-childitem -path $path | select-object PSChildName

            $Users | %{
             $OutPut = new-object PsCustomObject
             $OutPut | Add-Member -MemberType NoteProperty -Name SerialNumber -Value $SerialNumber -PassThru |
                 Add-Member -MemberType NoteProperty -Name Username -Value $_
             return $OutPut
            }
         }
}

 Get-UsersOnDrive -DriveLetters @("C") |  Export-Csv -Path C:\sample\Test.csv -NoTypeInformation

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Следующий код получает серийный номер диска.Я не уверен, зачем это нужно.Это даст вам начало?

function Get-DiskSerialNumber {
param(
    [Parameter(Mandatory = $true,Position=0)]
    [string] $DriveLetter
)

Get-CimInstance -ClassName Win32_DiskDrive |
    Get-CimAssociatedInstance -Association Win32_DiskDriveToDiskPartition |
    Get-CimAssociatedInstance -Association Win32_LogicalDiskToPartition |
    Where-Object DeviceId -eq $DriveLetter |
    Get-CimAssociatedInstance -Association Win32_LogicalDiskToPartition |
    Get-CimAssociatedInstance -Association Win32_DiskDriveToDiskPartition |
    Select-Object -Property SerialNumber
}

& openfiles /query /fo csv |
    Select-Object -Skip 5 |
    ConvertFrom-Csv -Header @('ID','USER','TYPE','PATH') |
    Select-Object -Property USER,@{name='DRIVE';expression={$_.PATH.Substring(0,2)}} |
    Sort-Object -Property DRIVE,USER -Unique |
    Select-Object -Property *,
         @{name='SERIALNUMBER';expression={(Get-DiskSerialNumber -Drive $_.DRIVE).SerialNumber}}
0 голосов
/ 03 октября 2018

Хорошо, вот то, что я придумал, и это грубо

Get-WmiObject Win32_Logicaldisk | %{
    $DriveLetter = $_.Name -replace ":", ""
    $SerialNumber = get-partition -DriveLetter $DriveLetter | get-disk | select -ExpandProperty SerialNumber
    $Users = Get-WmiObject Win32_UserProfile | select -ExpandProperty LocalPath | ?{$_ -like "$DriveLetter*"} | %{
        $_ -replace '.*\\'
    }
    $Users | %{
        $OutPut = new-object PsCustomObject
        $OutPut | Add-Member -MemberType NoteProperty -Name SerialNumber -Value $SerialNumber -PassThru |
            Add-Member -MemberType NoteProperty -Name Username -Value $_
        return $OutPut
    }
} | Export-Csv -Path C:\sample\Test.csv -NoTypeInformation

A.Получить WMI LogicalDisk (получает буквы дисков)

B.Передайте $ DriveLetter в get-раздел и получите значение свойства SerialNumber .

C.Получите путь к профилю пользователя, затем найдите те на текущем диске и замените все, кроме последней косой черты, которая является именем пользователя

D.Для каждого пользователя на диске мы создаем пользовательский объект и добавляем свойства SerialNumber и Username, затем возвращаем вывод и экспортируем в CSV

Вот функция, которую вы также можете вызвать, чтобы получить пользователей на диске

function Get-UsersOnDrive([string[]]$DriveLetters){
    if (!$DriveLetters){
        $DriveLetters = Get-WmiObject Win32_Logicaldisk | %{$_.Name -replace ":", ""}
    }

    foreach($DriveLetter in $DriveLetters){

        $SerialNumber =  get-partition -DriveLetter $DriveLetter -ErrorAction Ignore | get-disk | select -ExpandProperty SerialNumber

        $Users = Get-WmiObject Win32_UserProfile | select -ExpandProperty LocalPath | ?{$_ -like "$DriveLetter*"} | %{
            $_ -replace '.*\\'
        }

        $Users | %{
            $OutPut = new-object PsCustomObject
            $OutPut | Add-Member -MemberType NoteProperty -Name SerialNumber -Value $SerialNumber -PassThru |
                Add-Member -MemberType NoteProperty -Name Username -Value $_
            return $OutPut
        }
    }
}

Get-UsersOnDrive -DriveLetters @("C","V","F") |  Export-Csv -Path C:\sample\Test.csv -NoTypeInformation 

Если вы удалите параметр -DriveLetters и диски, он проверит все диски

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