Перечислять принтеры для определенного сеанса сервера терминалов - PullRequest
2 голосов
/ 24 марта 2009

Я ищу способ узнать, какие принтеры были назначены конкретным пользователем в его сеанс TS.

Как мне этого добиться с помощью WMI (через PowerShell) или VB-Script? Есть ли встроенный способ, о котором я не знаю?

РЕДАКТИРОВАТЬ : В нашей конструкции отображение локальных принтеров RDP-клиентом отключено. Пользователи получают свои принтеры, созданные при входе в систему через VBS-Script и удаляемые при выходе из системы.

То есть принтеры не установлены непосредственно на нашем сервере TS, и запрос WMI-класса Win32_Printers ничего не возвращает. Принтеры установлены на выделенном сервере печати. Запрос принтеров на этом сервере возвращает ВСЕ принтеры, а не тот, который сопоставлен для одного пользователя.

Ответы [ 6 ]

2 голосов
/ 20 июля 2010

Благодаря комментарию Ремко меня направили в правильном направлении и, наконец, сделали сценарий, который делал то, что мне нужно.

В основном скрипт определяет 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 голос
/ 24 марта 2009

Я не могу сейчас зарегистрироваться в сеансе TS, но обычно это происходит в powershell:

Get-WMIObject Win32_Printer

0 голосов
/ 05 апреля 2011

Это помогло мне, unlick seanyboy, который возвращает локальные принтеры, этот скрипт возвращает сетевые принтеры, к которым подключены пользователи, отлично работает на терминальном сервере \ сеанс Citrix

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

0 голосов
/ 05 октября 2009

Может быть, вам нужна технология на основе CUPS? Это простая задача для чашек на любом Unix, но я не уверен насчет Windows.

0 голосов
/ 15 сентября 2009

Отсюда: 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
0 голосов
/ 24 марта 2009

Насколько я понимаю, вы можете прочитать какое-то поле в реестре.

PS: я предпочитаю использовать Linux для службы терминалов;)

...