枚举特定终端服务器会话的打印机

时间:2009-03-24 09:11:04

标签: session terminal-services enumerate printers

我正在寻找一种方法来查看特定用户已将哪些打印机映射到他或她的TS会话中。

如何使用WMI(通过PowerShell)或VB脚本实现此目的?有没有我不知道的内置方式?

编辑:在我们的构造中,RDP-Client对本地打印机的映射被禁用。用户在登录期间通过VBS脚本创建打印机,并在注销期间删除。

因此,我们的TS服务器上没有直接安装打印机,并且查询Win32_Printers WMI类什么都不返回。打印机安装在专用打印服务器上。查询该服务器上的打印机将返回所有打印机,而不是为单个用户映射的打印机。

6 个答案:

答案 0 :(得分:2)

感谢Remko的评论,我被放到正确的方向,最后制作了一个完成我需要的脚本。

基本上,脚本确定用户的SID,并在用户的注册表配置单元( HKEY_USERS \ $ sid \ Printers \ Connections )中查找已创建的打印机。

这是快速而又脏的PowerShell脚本:

$server = 'servername'
$userName = 'username'

$regHKLM = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine", $server)
$regProfileList = $regHKLM.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList")

foreach ($sid in $regProfileList.GetSubKeyNames())
{
    $profileImagePath = $regProfileList.OpenSubKey($sid).GetValue("ProfileImagePath")
    if ($profileImagePath.EndsWith("\$userName"))
    {
        $regHKU = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("Users", $server)
        $regUser = $regHKU.OpenSubKey("$sid\Printers\Connections")
        foreach ($printer in $regUser.GetSubKeyNames())
        {
            $printer.Replace(",", "\")  # backslashes are replaced with commas, revert that
        }
    }
}

答案 1 :(得分:1)

我现在无法检查TS会话,但这通常在powershell中执行:

Get-WMIObject Win32_Printer

答案 2 :(得分:0)

从这里开始:http://www.microsoft.com/technet/scriptcenter/guide/sas_prn_tart.mspx?mfr=true

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colInstalledPrinters = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_Printer")
For Each objPrinter in colInstalledPrinters
 Wscript.Echo "Name: " & objPrinter.Name
 Wscript.Echo "Location: " & objPrinter.Location
Next

答案 3 :(得分:0)

可能你需要基于CUPS的技术吗?对于任何unix上的杯子来说这都是一项简单的任务,但我不确定Windows。

答案 4 :(得分:0)

这对我来说不知道seanyboy的答案,它返回本地打印机这个脚本返回用户连接的网络打印机,在终端服务器\ Citrix会话上正常工作

http://www.geekshangout.com/vbs-script-to-list-the-network-printers-a-user-is-connected-to/

答案 5 :(得分:-1)

据我了解你可以阅读注册表中的一些字段。

PS:我更喜欢使用Linux进行终端服务;)