Wdrażanie drukarek za pomocą GPO / GPP - czy istnieje opcja programowa?


10

Z przyczyn niezależnych ode mnie powierzono zadanie skonfigurowania obiektów GPO / GPP w celu wdrożenia naszych ponad 100 drukarek na ponad 1000 naszych klientów.

Dobra wiadomość jest taka, że ​​mamy kilkanaście witryn i w większości przypadków mogę wypychać wszystkie drukarki z witryny X na wszystkie komputery klienckie w witrynie X.

Zła wiadomość jest taka, że ​​dwa sposoby, które wiem, jak to zrobić ( „Wdrażanie za pomocą zasad grupy ...”, z serwera wydruku ” i korzystanie z preferencji zasad GPP / zasad grupy ) wymagają znacznie więcej pracy ręcznej, niż jestem skłonny zrobić. tak wielu drukarek. Nie mogę nawet wybrać wszystkich drukarek na serwerze druku i użyć Deploy with Group Policy...na przykład opcji - oczekuje, że zrobię to jedna po drugiej, co się nie stanie. GPP są jeszcze gorsze , ponieważ oczekuje, że wybiorę ścieżkę drukarki z serwera wydruku, a następnie ręcznie wprowadzę kilka informacji (takich jak adres IP drukarki), które powinna móc uzyskać z połączenia drukarki.

Mój Google-Fu dla skryptu, aby dodać wszystkie drukarki na serwerze wydruku do GPO / GPP, wyszedł pusty i wydaje mi się, że nie widzę innego sposobu na zrobienie tego nawet w sposób półautomatyczny, ale trzymam się z przekonaniem, że czegoś mi brakuje, ponieważ żaden rozsądny człowiek nie zdecydowałby się ręcznie dodać setek drukarek do obiektów GPO.

Idealnie chciałbym znaleźć programowy sposób korzystania z GPP, ale w tych okolicznościach każde rozwiązanie, które nie wymaga dziesiątek godzin ręcznego dodawania drukarek, byłoby po prostu świetne.

Czy ktoś ma sposób to zrobić, czy też będę musiał zbudować skrypt PowerShell i / lub nakłonić podwładnego do zrobienia tego?


1
Jak już wcześniej wspominałem na czacie, istnieje interfejs COM do programowego tworzenia i łączenia obiektów GPO ... wszystko zaczyna się od czegoś podobnego $GPM = New-Object -ComObject GPMgmt.Gpm. Myślę, że ten interfejs, choć jest absolutną świnią do pracy, może zapewnić nieco bardziej obsługiwaną metodę niż po prostu włamanie się do XML-a, który wygląda i pachnie jak prawdziwy GPO. Jednak nikt nie lubi COM. Co najmniej my Powershellers.
Ryan Ries

1
@RyanRies Tak, wciąż kopię to w mojej głowie, a jedną z rzeczy, o których nie zdecydowałem, jest to, czy mój skrypt musi być obsługiwany, czy tylko jednorazowa rzecz do skonfigurowania w pierwsze miejsce. Jestem pewien, że opublikuję to tutaj, cokolwiek skończę.
HopelessN00b

Kiedy mówisz, że musisz wdrożyć 100 drukarek, nie masz na myśli, że wszystkie komputery (1..1000) powinny mieć wszystkie 100 drukarek, prawda?
Adil Hindistan

1
@AdilHindistan Nie. Każdy komputer powinien mieć wszystkie drukarki dostępne na swojej stronie. (Mniej więcej.) Ale oddzielenie ich nie jest najtrudniejsze. Sprawia, że ​​drukarki stają się obiektami GPO w pierwszej kolejności, co okazuje się bardziej bolesne, niż mogłoby się wydawać.
HopelessN00b

Odpowiedzi:


7

Googowałem dość mocno, a nawet bawiłem się backup-GPOw nadziei, że uda mi się zhakować powstały plik XML i ponownie go zaimportować, ale podejrzewam, że skrypt PowerShell jest w twojej przyszłości.

Nie jest tak źle. Możesz wygenerować listę drukarek z najbliższego serwera, a następnie wykonać pętlę i zmapować je.

Coś takiego:

$net = New-Object -COMObject WScript.Network
$printserver = 'yourserver'

$printerlist = Get-WMIObject -class Win32_Printer -computer $printserver | Where-Object {$_.ShareName -ne $null} | Select-Object ShareName
foreach ($printer in $printerlist) 
{
    $printerpath = '\\' + $printserver + '\' + $printer.ShareName
    #echo $printerpath
    $net.AddWindowsPrinterConnection($printerpath)
}

Jeśli drukarki są nazywane logicznymi rzeczami i istnieje jakiś logiczny sposób na identyfikację maszyn, być może będziesz w stanie je udoskonalić. Na przykład wybrałem najbliższy serwer na podstawie pobrania adresu IP klienta. Jeśli adres IP to 10.20. *, Przejdź do server1. Itp.

Mam nadzieję że to pomogło.

Edytować:

Patrząc na dokumentację @ EvanAnderson, jestem prawie pewien, że XML można zhakować.

Odpowiedni fragment mojego wyeksportowanego pliku (z redakcjami):

<DSObject bkp:Path="CN={GUIDHERE},CN=PushedPrinterConnections,%GPO_MACH_DSPATH%" bkp:SourceExpandedPath="CN={13B9B596-452C-4652-A05D-78EF06610134},CN=PushedPrinterConnections,CN=Machine,CN={44A99FBA-0DB3-484C-808E-3DDAE9932A2B},CN=Policies,CN=System,DC=Domainname,DC=extension" bkp:ObjectClass="msPrint-ConnectionPolicy">
    <DSAttributeMultiString bkp:DSAttrName="showInAdvancedViewOnly">
        <DSValue><![CDATA[TRUE]]></DSValue>
    </DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="uNCName">
        <DSValue><![CDATA[\\Servername\PrinterShareName]]></DSValue>
    </DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="serverName">
        <DSValue><![CDATA[\\Servername]]></DSValue></DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="printAttributes">
        <DSValue><![CDATA[0]]></DSValue>
    </DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="printerName">
        <DSValue><![CDATA[PrinterShareName]]></DSValue>
    </DSAttributeMultiString>
</DSObject>

To dobra odpowiedź (i może w końcu użyję czegoś takiego, aby dotrzymać niektórych z naszych terminów), ale podejrzewam, że stażysta lub podwładny jest w przyszłości w tym pytaniu, ponieważ jesteśmy zobowiązani do korzystania z GPO / GPP do przypisywania drukarki w pewnym momencie. I chociaż skrypt logowania PS technicznie spełniałby ten wymóg, spodziewam się, że kierownictwo narzuci się na mnie na tyle, że nie warto będzie tego robić w ten sposób.
HopelessN00b

Niestety. :( Polecenia cmdlet programu PowerShell GPO wydają się tworzyć kopie zapasowe, przywracać, tworzyć puste obiekty ... ale nie dodawać do obiektów GPO. Obiekty XML, które mają zasady drukarki, wyglądają całkowicie hackowalne, z wyjątkiem GUID.
Katherine Villyard

1
Tak, bez narzędzi innych firm automatyzacja GPO / GPP za pomocą PowerShell jest dość bolesna. Znalazłem coś, co wygląda całkiem nieźle , z wyjątkiem faktu, że wymaga pakietu oprogramowania innej firmy, którego prawdopodobnie nie będziemy mogli kupić ... więc prawdopodobnie będzie to taki skrypt, jak edycja pliku XML w istniejącej witrynie GPO ... które, jak sądzę, opublikuję tutaj, kiedy skończę.
HopelessN00b

8

Zdaniem Powershell zarządzanie zasadami grupy jest do bani bez produktów innych firm (komercyjnych).

Myślę, że utknąłeś w przeszukiwaniu XML (lub HTML, jeśli wolisz ) w obiektach zasad grupy, aby robić to, czego szukasz.

Na szczęście XML nie wygląda tak przerażająco . Wartość identyfikatora UID dla drukarki (do której, jak sądzę, odnosi się @KatherineVillyard w swoim komentarzu), jest po prostu losowym identyfikatorem GUID generowanym dla każdej drukarki wymienionej w pliku XML.

Oto przykładowy kod Powershell, bezwstydnie wzorowany na kodzie Katherine:

@"
<?xml version="1.0" encoding="utf-8"?>
<Printers clsid="{1F577D12-3D1B-471e-A1B7-060317597B9C}" disabled="0">
"@

$net = New-Object -COMObject WScript.Network
$printserver = 'print-server'

$printerlist = Get-WMIObject -class Win32_Printer -computer $printserver | Where-Object {$_.ShareName -ne $null} | Select-Object ShareName
foreach ($printer in $printerlist) 
{
    $date = Get-Date
    echo '  <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}"'
    '    name="' + $printer.ShareName + '"' | echo
    '    status="' + $printer.ShareName + '"' | echo
    echo '    image="2"'
    '    changed="' + $date + '"' | echo
    $ng = [GUID]::NewGuid().ToString('B')
    '    uid="' + $ng + '">' | echo

    echo '    <Properties'
    echo '      action="R"'
    echo '      comment=""'
    '      path="\\' + $printserver + '\' + $printer.ShareName + '"' | echo
    echo '      location=""'
    echo '      default="1"' 
    echo '      skipLocal="1"'
    echo '      deleteAll="0"'
    echo '      persistent="0"'
    echo '      deleteMaps="0"'
    echo '      port=""/>'
    echo '  </SharedPrinter>'
}

@"
</Printers>
"@

(Piszę naprawdę, bardzo brzydki kod Powershell.)

Tak naprawdę nie próbowałem, aby GPE CSE analizowało ten XML. XML przynajmniej sprawdza poprawność.

Zaczynam myśleć o napisaniu potworności przy użyciu Get-GPOi analizowaniu identyfikatora GUID, aby dostać się do ścieżki systemu plików dla obiektu GPO w SYSVOL, ale biorąc pod uwagę, że muszę dziś wieczorem trochę popracować, myślę, że odejdę to ćwiczenie dla czytelnika. > uśmiech <Powinno to być jednak wysoce wykonalne.


Jeśli jest to przypadkowy GUID, z pewnością można go zhakować. Właśnie zaktualizowałem mój. Heh
Katherine Villyard

Modyfikacja pliku XML w kopii zapasowej zasad grupy z pewnością zadziałałaby, ale zmiana go „na żywo” w SYSVOL-ie również powinna być wykonalna (pod warunkiem, że jeden jest odważny, głupi lub, jak ja, oba). Ponieważ mam dziś naprawdę dużo pracy do zrobienia (i ponieważ w tym kwartale ponownie wróciłem do @ewwhite do rankingu przedstawicieli), myślę, że zaoszczędzę ładowanie tej konkretnej broni i kierowanie jej pod nogi dla kogoś innego. > chichot <
Evan Anderson

Jestem odważny, ale nie jestem taki odważny. ;) Wygeneruj plik, przetestuj importuj go w środowisku testowym itp.
Katherine Villyard

2
Powershell naprawdę potrzebuje więcej opcji GPO. Get-Link, Set-Link, New-GPO i Set-GPORegistry nie są wystarczająco dobre ...
Mark Henderson

Wbudowane polecenia PowerShell czasem nie wystarczają. W takim przypadku proponuję przyjrzeć się rozwiązaniom „faceta z GPO”. Ma firmę: sdmsoftware.com
Adil

0

Niedawno podjąłem podobny projekt i po przeanalizowaniu dobrej starej metody wypychania GPO vs. nowszych GPP vs. skryptów, zdecydowałem się na skryptowanie całej sprawy. Nie mam pojęcia, co będzie dla Ciebie najlepsze, ale oto kilka wskazówek dla Ciebie:

  • Idealnie użyj klienta z nowym systemem operacyjnym (Windows 8/2012 +), aby połączyć się z serwerami wydruku i uzyskać informacje o drukarce z serwerów wydruku:

    Get-Printer -computer PrintServerName

  • Grupy zabezpieczeń AD służą do mapowania kolejek wydruku na komputery. Powiedzmy, że masz kolejkę wydruku (zebraną z powyższego polecenia) o nazwie \ PrintServer1 \ MyColorPrinter123, utwórz grupę zabezpieczeń, np. Printer.group.PrintServer1.MyColorPrinter123 i dodaj komputery do tej grupy

  • W skrypcie startowym funkcja umożliwia sprawdzenie członkostwa grupy w komputerze, gdy się zbliża, i sprawdzenie, czy należy on do jakiejkolwiek grupy drukarek. Jeśli tak, użyj wbudowanych poleceń printui.exe (lub printui.dll), aby zmapować drukarkę w ten sposób

    Wywołanie wyrażenia „rundll32 printui.dll, PrintUIEntry / ga / n” \ PrintServer1 \ MyColorPrinter123 ”/ q”

  • Gdy komputer się uruchomi, ta usługa buforowania wydruku przekaże „połączenie drukowania”, tak jak to robią obiekty GPO, każdemu użytkownikowi, który się zaloguje.

Możesz przejść o wiele bardziej szczegółowo **, ale na wysokim poziomie to wystarczy.

** Stworzyłem GUI, który pozwala użytkownikom (naprawdę technikom) wybrać dowolny serwer wydruku i daje im listę drukarek na tym serwerze. Jeśli wybiorą jedną, zobaczą wszystkie jej właściwości. Te informacje pochodzą z wyżej wymienionej drukarki Get-Printer. Jeśli wyeksportujesz te dane jako plik csv, możesz ponownie użyć ich do wyświetlenia informacji.

** Technicy używają tego GUI do wysyłania żądania dodania komputera do drukarek, które mają się połączyć. To jest „żądanie”, ponieważ nie mają uprawnień w AD.

** Prosty skrypt zaplecza obserwuje folder i dodaje komputer do wyżej wymienionej grupy drukarek. Tak więc, jeśli już wiesz, kto powinien wybrać drukarkę, świetnie, możesz to łatwo zrobić. Dodawanie komputerów do grup to proste zadanie z poleceniami cmdlet AD.

** Możesz również zaplanować zadanie, aby sprawdzić serwery wydruku, aby sprawdzić, czy są jakieś nowe kolejki wydruku i porównać je z grupami AD.

Tak więc tworzenie „zarządzanego” rozwiązania jest trochę skomplikowane, ale łatwo jest zacząć od podstaw i dodawać, aby uzyskać bardzo elastyczny, łatwy w użyciu system, który nie wymaga GPO ... tylko trochę PowerShell

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.