其他用户的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
我正在尝试为计算机上的用户收集用户配置文件信息,我想知道是否可以使用 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