2009-03-24 17 views
1

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

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

EDIT: В нашей конструкции отображение локальных принтеров RDP-Client отключено. Пользователи получают свои принтеры, созданные во время входа в систему через VBS-Script, и удаляются при выходе из системы.

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

ответ

2

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

В основном сценарий определяет 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

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

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

+0

Это не работает, как на удаленный рабочий стол, реестр HKCU \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Устройства могут содержать принтеры, которые больше не активны. – seanyboy

+2

попробуйте HKEY_CURRENT_USER \ Принтеры \ Подключения – Remko

1

я не могу проверить в сессии TS прямо сейчас, но это делает это, как правило, в PowerShell:

Get-WmiObject Win32_Printer

+0

Это также работает для сеансов TS. Я возвращаю драйверы с именами типа « на (от ) в сеансе ». Они также имеют имя порта «TSxxx». Может существовать объект для отношения к сеансу, но я ничего не мог найти. – JasonMArcher

+0

Это не работает в нашей конструкции, так как принтеры не установлены на сервере терминалов. Я обновил вопрос. – VVS

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 
+0

Используя этот метод, вы получите список принтеров, установленных локально на сервере, который пуст. Принтеры для пользователя добавляются в сеанс через WshNetwork.AddWindowsPrinterConnection и не могут быть замечены вашим скриптом. – VVS

0

Может быть Вам нужно TECNOLOGY CUPS на основе? Это простая задача для кубков в любом unix, но я не уверен в Windows.

0

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

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

+0

Это может работать, чтобы получить сетевые принтеры реальных пользователей, но я хотел получить список принтеров для конкретного пользователя. – VVS