Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Как получить список расшаренных принтеров? (http://forum.oszone.net/showthread.php?t=302557)

yanus74 17-07-2015 19:37 2529814

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

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

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

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

Iska 17-07-2015 21:46 2529856

Цитата:

Цитата yanus74
Все решения которые я находил (Win32_Printer), требовали прав администратора на сервере, »

Приведите примеры некоторых из «всех решений».

yanus74 17-07-2015 21:48 2529857

Цитата:

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

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

Get-WmiObject -Class Win32_Printer -ComputerName

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

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

Iska 17-07-2015 22:10 2529871

yanus74, так вот я и спрашиваю, чтобы посмотреть. Я не уверен, что простое перечисление требует наличия административных прав.

yanus74 17-07-2015 22:16 2529874

Цитата:

Цитата Iska
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 2529887

Вообще-то должно быть «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 2529891

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 2529893

yanus74, а на WSH, интересно, как отреагирует?

yanus74 18-07-2015 07:54 2529923

Iska, я не знаю как на vbs это реализовать.

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

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

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

Iska 18-07-2015 08:12 2529926

Цитата:

Цитата yanus74
Сами Win32_Share и Win32_Printer не имеют методов, указывающих, с какого компьютера получать вывод.
Видимо, нужен либо другой объект wmi или com, который будет иметь метод, в который можно будет передать имя компьютера, с которого нужно получить данные. »

Имя машины задаётся при подключении к ней.

yanus74 18-07-2015 09:32 2529945

Вот такая конструкция получилась, с использованием 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 2530001

Цитата:

Цитата yanus74
В любом случае, я считаю, что работать не будет. »

К сожалению, именно так. Вот код на 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 2530015

Попробуйте с помощью Get-Printer:
Код:

help get-printer -examples

yanus74 18-07-2015 16:46 2530022

Цитата:

Цитата Foreigner
Попробуйте с помощью Get-Printer: »

Get-Printer работает только в win 8.1 и выше, и win 2012 r2.

yanus74 18-07-2015 19:49 2530071

Вообщем скрипт я себе написал, оставлю его здесь, вдруг компу пригодится.
Напомню, принтеры расшарены на сервере-печати, на каждый принтер назначена группа доступа. Так же есть группа доступа для политики, которая добавляет 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)
        }
}

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


Время: 21:38.

Время: 21:38.
© OSzone.net 2001-