转储连接的驱动器序列和用户

时间:2018-10-03 13:21:31

标签: powershell csv output concatenation

我需要在输出文件中列出已连接驱动器的用户及其序列号。我将一次在阵列中的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)

但没有

我需要它来获取每个驱动器的序列号,并输出与该驱动器关联的用户……我在努力使输出看起来像我想要的那样。

对于每个-阵列中的驱动器-修改我的.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 :(得分:0)

好的,这就是我想出的内容及其粗略之处

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-partition中,并获得 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参数和驱动器,则它将检查所有驱动器

答案 1 :(得分:0)

以下代码获取磁盘序列号。我不确定为什么需要这样做。这会给您一个开始吗?

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}}