Перечислить принтеры для определенного сеанса сервера терминалов

StackOverflow https://stackoverflow.com/questions/676616

Вопрос

Я ищу способ увидеть, какие принтеры конкретный пользователь сопоставил со своим сеансом 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 для службы терминалов;)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top