Powershell gwmi面向其他用户

时间:2015-07-26 06:35:08

标签: powershell wmi

我正在尝试为计算机上的用户收集用户个人资料信息,我想知道我是否可以通过gwmi获取它。以下是我为当前用户获取打印机的方法:Get-WmiObject win32_printer。如何为用户获取相同的信息"测试"在同一台机器上?

1 个答案:

答案 0 :(得分: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只是代码,用于确定您提供的内容并根据需要进行翻译。返回你想要的东西只是一行:

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