其他用户的Powershell wmi

Powershell gwmi for other users

我正在尝试为计算机上的用户收集用户配置文件信息,我想知道是否可以使用 gwmi 获取它。以下是我如何为当前用户获取打印机:Get-WmiObject win32_printer。如何在同一台机器上获取用户 "Test" 的相同信息?

正好我睡不着,想出了这2个功能:

function Get-UserSid {
[CmdletBinding()]
param(
    [Parameter(
        ParameterSetName='NTAccount',
        Mandatory=$true,
        ValueFromPipeline=$true,
        Position=0
    )]
    [System.Security.Principal.NTAccount]
    $Identity ,

    [Parameter(
        ParameterSetName='DomainAndUser',
        Mandatory=$true
    )]
    [ValidateNotNullOrEmpty()]
    [ValidatePattern('^[^\]+$')]
    [String]
    $Domain ,

    [Parameter(
        ParameterSetName='DomainAndUser',
        Mandatory=$true
    )]
    [ValidateNotNullOrEmpty()]
    [ValidatePattern('^[^\]+$')]
    [String]
    $User
)

    Begin {
        if ($PSCmdlet.ParameterSetName -eq 'DomainAndUser') {
            $Identity = New-Object System.Security.Principal.NTAccount -ArgumentList $Domain,$User
        }
    }

    Process {
        $Identity.Translate([System.Security.Principal.SecurityIdentifier])
    }
}

function Get-PrinterNameByUser {
[CmdletBinding(DefaultParameterSetName='Ambiguous')]
param(
    [Parameter(
        ParameterSetName='ByAccount',
        Mandatory=$true
    )]
    [System.Security.Principal.NTAccount]
    $Account ,

    [Parameter(
        ParameterSetName='BySID',
        Mandatory=$true
    )]
    [System.Security.Principal.SecurityIdentifier]
    $SID ,

    [Parameter(
        ParameterSetName='Ambiguous',
        Mandatory=$true,
        Position=0,
        ValueFromPipeline=$true
    )]
    [ValidateNotNullOrEmpty()]
    [String]
    $Identity
)

    Begin {
        Write-Verbose "Parameter Set Name: $($PSCmdlet.ParameterSetName)"
        if ($PSCmdlet.ParameterSetName -eq 'ByAccount') {
            $SID = $Account | Get-UserSid
        }
    }

    Process {
        if ($PSCmdlet.ParameterSetName -eq 'Ambiguous') {
            try {
                $SID = [System.Security.Principal.SecurityIdentifier]$Identity
            } catch [System.InvalidCastException] {
                $Account = [System.Security.Principal.NTAccount]$Identity
                $SID = $Account | Get-UserSid
            }
        }
        Get-ChildItem -Path "Registry::\HKEY_Users$($SID.Value)\Printers" | Select-Object -ExpandProperty Property -Unique
    }    

}

用法

Get-PrinterNameByUser Test
Get-PrinterNameByUser 'domain\test'
Get-PrinterNameByUser 'S-1-S-21-65454546-516413534-4444'

所有这些都可以通过管道传输:

'Test' | Get-PrinterNameByUser
'domain\test' | Get-PrinterNameByUser
'S-1-S-21-65454546-516413534-4444' | Get-PrinterNameByUser

'S-1-S-21-65454546-516413534-4444','user1','machine\user2','domain\user3' | Get-PrinterNameByUser

说明

HKU\S-ID-HERE\Printers 的注册表中,有一些具有属性的键。 属性 名称是打印机。我无法在足够多的机器上测试它,所以我不确定我应该检查哪个键,以及它们是否会有所不同,具体取决于它是本地打印机还是网络打印机等,所以我'我只是从所有键中获取属性并返回唯一的属性。

辅助函数 Get-UserSid 只是提供了一种从用户名获取 SID 的便捷方法。

大部分 Get-PrinterNameByUser 只是代码,用于确定您提供的内容并在需要时进行翻译。 returns 你想要的只是一行:

Get-ChildItem -Path "Registry::\HKEY_Users$($SID.Value)\Printers" | Select-Object -ExpandProperty Property -Unique