Перечислить принтеры для определенного сеанса сервера терминалов
-
21-08-2019 - |
Вопрос
Я ищу способ увидеть, какие принтеры конкретный пользователь сопоставил со своим сеансом TS.
Как я могу добиться этого с помощью WMI (через PowerShell) или VB-Script?Есть ли встроенный способ, о котором я не знаю?
РЕДАКТИРОВАТЬ:В нашей конструкции отключено отображение локальных принтеров RDP-клиентом.Пользователи получают свои принтеры, создаваемые при входе в систему с помощью VBS-Script и удаляемые при выходе из системы.
Таким образом, непосредственно на нашем TS-сервере не установлены принтеры, и запрос к классу WMI Win32_Printers ничего не возвращает.Принтеры установлены на выделенном сервере печати.Запрос принтеров на этом сервере возвращает ВСЕ принтеры, а не тот, который сопоставлен для одного пользователя.
Решение
Благодаря комментарию Ремко меня направили в правильном направлении, и я наконец-то создал сценарий, который делал то, что мне было нужно.
По сути, скрипт определяет SID пользователя и просматривает куст реестра пользователя (HKEY_USERS\$sid\Принтеры\Соединения) для созданных принтеров.
Вот быстрый и грязный сценарий 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
}
}
}
Другие советы
Я не могу сейчас проверить сеанс TS, но в PowerShell это обычно происходит:
Get-WMIObject Win32_Printer
Отсюда: 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
Возможно, Вам нужна технология на базе CUPS?Это простая задача для чашек в любом Unix, но я не уверен насчет Windows.
Это помогло мне отключить ответ seanyboy, который возвращает локальные принтеры. Этот сценарий возвращает сетевые принтеры, к которым подключены пользователи, отлично работает в сеансе Terminal Server \ Citrix.
http://www.geekshangout.com/vbs-script-to-list-the-network-printers-a-user-is-connected-to/
Насколько я понимаю, вы можете прочитать некоторые поля в реестре.
ПС:Я предпочитаю использовать Linux для службы терминалов;)