Войти

Показать полную графическую версию : [решено] Как получить список расшаренных принтеров?


yanus74
17-07-2015, 19:37
Здравствуйте!
Настраиваю сервер печати в домене на windows server 2008r2.
Стоял вопрос, как подключать принтеры, расшаренные на сервере, пользователям.
Изучив множество решений, пришел к такому:
1. На каждый принтер назначил группу безопасности. Если пользователь не состоит в группе, то он не сможет подключить принтер, и печатать на него.
2. Политикой разрешить пользователю устанавливать драйвера для принтеров.
3. установку/удаление принтером производить logon скриптом:

алгоритм скрипта:
1. получить список установленных (подключенных) принтеров.
2. Все принтеры подключенные с сервера печати, но без доступа ( если ранее пользователь имел доступ к принтеру, состоял в группе, а потом пользователя удалили из группы безопасности) отключить.
3. получить список всех принтеров с сервера (список можно отфильтровать по доступности), подключить все принтеры из списка ( с подавлением ошибки о отсутствие доступа) ( наверно, нужна будет проверка на уже подключенные).

Все этапы, вроде как понятны, и широко описаны в интернете, за исключением, получения списка расшаренных на сервере принтеров. Все решения которые я находил (Win32_Printer), требовали прав администратора на сервере, а скрипт планируется запускать с правами пользователя. Конечно, можно сформировать список и сохранить его в ТХТ, и потом подключать принтеры ссылаясь на этот список. Но это план Б)

И вопрос: Как получить список расшаренных принтеров с сервера печати, без прав администратора? Подскажите пожалуйста.

Iska
17-07-2015, 21:46
Все решения которые я находил (Win32_Printer), требовали прав администратора на сервере, »
Приведите примеры некоторых из «всех решений».

yanus74
17-07-2015, 21:48
Профиль | Отправить PM | Цитировать | Сообщить модератору
Цитата yanus74:
Все решения которые я находил (Win32_Printer), требовали прав администратора на сервере, »
Приведите примеры некоторых из «всех решений». »

Все что я находил, было реализовано через wmi class Win32_Printer. Просто разное оформление.

Get-WmiObject -Class Win32_Printer -ComputerName

поискал на английском, нашел еще "net view \\MyServer ", есть еще какие нибудь способы?)

Интересуют решение на powershell

Iska
17-07-2015, 22:10
yanus74, так вот я и спрашиваю, чтобы посмотреть. Я не уверен, что простое перечисление требует наличия административных прав.

yanus74
17-07-2015, 22:16
yanus74, так вот я и спрашиваю, чтобы посмотреть. Я не уверен, что простое перечисление требует наличия административных прав. »
На сколько я понял, коммандлет Get-WmiObject с ключом -ComputerName выполняет запуск WMI класса на указанном компьютере, и если указать сервер, то выдает ошибку, что не достаточно прав. Локально отрабатывает, под пользователем.

Get-WmiObject -Class Win32_Printer -ComputerName W2K8R2-PS-TEST
Get-WmiObject : Отказано в доступе. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))
строка:1 знак:14
+ Get-WmiObject <<<< -Class Win32_Printer -ComputerName W2K8R2-PS-TEST
+ CategoryInfo : NotSpecified: (:) [Get-WmiObject], UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

Если запустить консоль с правами администратора домена, то коммандлет возвращает все принтеры ( и не шаренные) с сервера

Iska
17-07-2015, 23:18
Вообще-то должно быть «Win32_Share», а не «Win32_Printer»:
gwmi -Class Win32_Share -ComputerName W2K8R2-PS-TEST -Filter 'Type=1'

P.S. Я сейчас, к сожалению, не скажу навскидку разницу для «Type» между «Print Queue» и «Print Queue Admin». По поводу подключений попробую посмотреть завтра.

yanus74
17-07-2015, 23:28
Iska,
результат выполнения из под обычного пользователя: gwmi -Class Win32_Share -ComputerName W2K8R2-PS-TEST -Filter 'Type=1'

Get-WmiObject : Отказано в доступе. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))
строка:1 знак:5
+ gwmi <<<< -Class Win32_Share -ComputerName W2K8R2-PS-TEST -Filter 'Type=1'
+ CategoryInfo : NotSpecified: (:) [Get-WmiObject], UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

Iska
17-07-2015, 23:51
yanus74, а на WSH, интересно, как отреагирует?

yanus74
18-07-2015, 07:54
Iska, я не знаю как на vbs это реализовать.

В любом случае, я считаю, что работать не будет. Т.к. в PowerShell, командлет Get-WmiObject запускает на удаленном компьютере ( ключ -ComputerName) Win32_Share. А для этого нужен доступ к этому объекту ( можно конечно разрешить, но вот как , я пока хз. ну и если разрешить доступ для обычных пользователей, к этому объекту wmi, то пользователь через этот объект сможет управлять принтерами ( сетевыми папками)).

Сами Win32_Share и Win32_Printer не имеют методов, указывающих, с какого компьютера получать вывод.

Видимо, нужен либо другой объект wmi или com, который будет иметь метод, в который можно будет передать имя компьютера, с которого нужно получить данные.

Iska
18-07-2015, 08:12
Сами Win32_Share и Win32_Printer не имеют методов, указывающих, с какого компьютера получать вывод.
Видимо, нужен либо другой объект wmi или com, который будет иметь метод, в который можно будет передать имя компьютера, с которого нужно получить данные. »
Имя машины задаётся при подключении к ней.

yanus74
18-07-2015, 09:32
Вот такая конструкция получилась, с использованием net view

net view \\W2K8R2-PS-TEST | foreach -process {if ($_ -Like "*Печать*") {(($_).Remove(($_).IndexOf("Печать"))).Trim()}}

выводит:
1 этаж ИТ отдел (M1214) черно-белый
1 этаж-рецепция (M1536) черно-белый
принтер-чб(ID670)
за место:
Общие ресурсы на \\W2K8R2-PS-TEST



Имя общего ресурса Тип Используется как Комментарий

-------------------------------------------------------------------------------
1 этаж ИТ отдел (M1214) черно-белый Печать 1 этаж ИТ отдел (M1214) черно-белый
1 этаж-рецепция (M1536) черно-белый Печать 1 этаж-рецепция (M1536) черно-белый
принтер-чб(ID670) Печать принтер-чб(ID670)
Команда выполнена успешно.

Iska
18-07-2015, 14:37
В любом случае, я считаю, что работать не будет. »
К сожалению, именно так. Вот код на WSH:
Option Explicit

Dim strComputer
Dim objSWbemObjectEx


strComputer = "W2K8R2-PS-TEST"

With WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(strComputer, "root\cimv2")
For Each objSWbemObjectEx In .ExecQuery("SELECT * FROM Win32_Share WHERE Type = 1")
With objSWbemObjectEx
WScript.Echo .Name, .Path, .Description, .Type
End With
Next
End With

WScript.Quit 0

Под простым пользователем — именно «отлуп» при попытке «поуправлять» удалённой машиной :).

Foreigner
18-07-2015, 16:21
Попробуйте с помощью Get-Printer:

help get-printer -examples

yanus74
18-07-2015, 16:46
Попробуйте с помощью Get-Printer: »
Get-Printer работает только в win 8.1 и выше, и win 2012 r2.

yanus74
18-07-2015, 19:49
Вообщем скрипт я себе написал, оставлю его здесь, вдруг компу пригодится.
Напомню, принтеры расшарены на сервере-печати, на каждый принтер назначена группа доступа. Так же есть группа доступа для политики, которая добавляет logon скрипт для пользователя. Что бы пользователь мог ставить драйвера на принтер, через политику разрешается установка:
Конфигурация пользователя - Политика- Административные шаблоны - Панель управления - принтеры
Ограничения указания и печати - Включено
При установке драйверов для нового подключения: Не показывать предупреждение или запрос на повышение прав
При обновлении драйверов для нового подключения: Не показывать предупреждение или запрос на повышение прав

Сам logon скрипт (powershell):

#Удаление принтера к которому утрачен доступ
Get-WmiObject -Class Win32_Printer | foreach { if ($_.PrinterState -eq $null) {$_.delete()}}
#Подключить все доступные принтеры на сервере \\W2K8R2-PS-TEST
net view \\W2K8R2-PS-TEST | foreach -process {
if ($_ -Like "*Печать*") {
$path = "\\W2K8R2-PS-TEST\" + (($_).Remove(($_).IndexOf("Печать"))).Trim()
([WMICLASS]'Win32_Printer').AddPrinterConnection($path)
}
}

Толком я его не тестировал, все еще впереди, но по отдельности все работало как запланировано.
Всем спасибо за помощь)




© OSzone.net 2001-2012