Preferensi Kebijakan Grup dan PowerShell saat printer menghitung hingga ratusan



Banyak salinan yang rusak mengelola printer jaringan pada komputer pengguna. Pada dasarnya, administrator dibagi menjadi dua kubu: menghubungkan dengan skrip logon (bat / vbs) dan mengelola melalui GPP. Kedua pendekatan memiliki kelebihan: skrip diproses lebih cepat, dan GPP lebih fleksibel dan digunakan lebih sering daripada pengguna me-reboot komputer. Tetapi ketika ada lebih dari seratus printer dan mereka tersebar di puluhan kantor dan kota, akan ada kesulitan dalam kedua kasus tersebut.

Hal ini diperlukan tidak hanya untuk menghubungkan set printer yang benar ke setiap pengguna, dengan mempertimbangkan lokasinya saat ini, tetapi juga tidak melupakan apa pun. Dan jika terkadang tidak hanya pengguna, tetapi juga printer itu sendiri dipindahkan ...

Secara umum, kolega saya dan saya memilih GPP untuk diri kita sendiri, pertama-tama, sehingga seseorang selain administrator terkemuka dapat mengetahui konfigurasi saat ini hanya dengan melihat laporan GPMC. Namun, siapa pun yang mengatakan bahwa antarmuka standarnya nyaman untuk mengelola 100+ perangkat - biarkan yang pertama melempar batu ke arah saya. Selain itu, selama komisioning batch berikutnya, Anda perlu melakukan banyak rutin untuk mengkonfigurasi pemindaian jaringan dan menambahkannya ke server cetak.

Dan segala sesuatu yang dilakukan lebih dari satu kali dapat diotomatisasi!

Apa yang akan kita lakukan hari ini?

  • menyimpan catatan semua printer jaringan;
  • mengotomatiskan penambahan printer ke GPP (PS / XML);
  • mengotomatiskan penambahan printer ke server cetak, dan ke kluster (BAT / VBS)!

Jadi mari kita mulai.

1. Akuntansi untuk printer jaringan


Masalah pertama yang muncul ketika mengelola sejumlah besar objek adalah akuntansi. Tanpa itu, mudah untuk bingung tentang di mana itu diinstal dan kepada siapa itu harus terhubung.
Solusi paling sederhana dan paling universal adalah CSV. Pada akhirnya, dari sistem inventaris apa saja, ServiceDesk atau Excel spreadsheet dapat diunggah ke CSV dan kemudian dengan mudah diimpor ke PowerShell, yang akan kita lakukan selanjutnya.

Bongkar kami terlihat seperti ini:

gambar

Saya akan segera menjelaskan mengapa ada begitu banyak bidang:

  • Name - nama jaringan printer, ditulis dalam DNS dan di server cetak
  • ByGroup - bidang menentukan apakah akan menghubungkan printer ke semua orang yang berada di subnet yang sesuai atau hanya untuk mereka yang menjadi anggota grup AD. Grup ini juga mendefinisikan ACL.
  • Subnet - subnet di mana pengguna harus dapat bekerja dengan printer
  • Lokasi - garis lokasi printer tempat wizard Windows Add Printer mencari
    Bagaimana pencarian printer berdasarkan lokasi diatur
    Banyak orang tidak tahu apa yang terjadi ketika printer mencari panduan pengaturan printer standar. Dan inilah yang terjadi. Wisaya mengambil bidang Lokasi dari atribut komputer dalam AD, dan memilih dari printer yang diterbitkan dalam AD semua yang lokasinya dimulai pada baris yang sama. Yaitu, jika komputer pengguna di lokasi menunjukkan "Omsk / Office on Lenin", maka pencarian akan menampilkan printer dengan lokasi "Omsk / Office on Lenin /", "Omsk / Office on Lenin / Office 404" dan "Omsk / Office on Lenin / Penerimaan ยป
  • Driver - nama driver yang akan ditentukan saat menambahkan ke server cetak. Driver ini harus sudah diinstal di server. Biasanya, semua produsen yang memasok peralatan pencetakan yang kurang lebih serius memiliki driver universal, dan mereka dipasang paling banyak sekali per batch, dan kemudian jika vendor telah berubah, jadi saya tidak mengotomatisasi bagian ini.
  • Tipe hanyalah deskripsi dari printer sehingga pengguna dapat dengan mudah memilih printer yang mereka butuhkan sesuai dengan kemampuannya jika perlu.
  • Model - model printer atau MFP. Di sini, dengan bantuan tabel bantu, dua sebelumnya diisi untuk bidang ini.
  • UID - dan ini adalah bagian dari kue hari ini. UID ini menandai objek di GPP, disederhanakan - agar tidak menginstal ulang printer setiap kali Kebijakan Grup diperbarui.

Dataset ini cukup untuk tidak membuat hardcode mereka di Powershell. Anda bisa memulai kesenangan.

2. Otomatiskan GPP


Secara umum, file Printers.xml dalam objek GPP terlihat seperti ini:

<?xml version="1.0" encoding="utf-8"?> <Printers clsid="{1F577D12-3D1B-471e-A1B7-060317597B9C}"> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-BARAB-061" status="PRN-BARAB-061" image="2" uid="{43231EA0-A4A3-4F1A-8A25-95BC4FEFBCC6}" userContext="1" bypassErrors="1"> <Properties action="U" comment="" path="\\print-cluster-1.common.domain\PRN-BARAB-061" default="0" port="" /> <Filters> <FilterGroup bool="AND" not="0" name="COMDOM\PRN-BARAB-061" sid="S-1-5-21-210359847-7924152125-768726458-48993" userContext="1" /> <FilterIpRange bool="AND" not="0" min="192.168.142.1" max="192.168.142.254" /> </Filters> </SharedPrinter> </Printers> 

Sumber format dapat dipelajari di sini: [MS-GPPREF]: Printer dan di sini: [MS-GPPREF]: Atribut XML Umum .

Dalam praktiknya, saya pikir, Anda dapat dengan mudah membandingkan nama bidang dalam file ini dengan kotak centang di antarmuka GPP, tetapi saya akan mencatat poin-poin penting:

clsid adalah nilai tetap dari kelas Preferensi Kebijakan Grup, mereka dapat (dan harus) dibiarkan apa adanya.

Nama / Status adalah nama tampilan elemen di konsol GPP.
uid - tetapi ini adalah pengidentifikasi unik objek yang Anda lihat pada tabel di atas.

Jika berubah setiap kali daftar printer diperbarui, printer akan terhubung kembali ke semua pengguna, yang dapat menyebabkan efek samping yang berbeda.
Path - path UNC ke printer
FilterGroup, FilterIpRange - Menargetkan elemen berdasarkan keanggotaan pengguna dalam grup AD dan dengan menemukan komputer dalam kisaran alamat IP.

2.1. Kami mengimpor data dan membuat struktur dasar dokumen XML:


Untuk melakukan ini, gunakan kelas sistem [System.Xml.XmlDocument]:

 $PrintersCSV = Import-Csv -Delimiter ";" ".\Printers.csv" -Encoding Default [System.Xml.XmlDocument]$PrintersGPP = New-Object System.Xml.XmlDocument $PrintersGPP.PrependChild($PrintersGPP.CreateXmlDeclaration("1.0", "utf-8", $null)) | Out-Null $Printers = $PrintersGPP.AppendChild($PrintersGPP.CreateElement("Printers")) $Printers.SetAttribute("clsid","{1F577D12-3D1B-471e-A1B7-060317597B9C}") 

2.2. Tambahkan beberapa fungsi pembantu untuk membuat elemen XML yang diperlukan dan mengatur atributnya


Membuat item printer:

 Function NewSharedPrinter { [CmdletBinding()] param ( $SharedPrinter, $clsid = "{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}", $uid, $name, $action ) $image switch ($action){ "C" {$image = 0} "R" {$image = 1} "U" {$image = 2} "D" {$image = 3} } $SharedPrinter.SetAttribute("clsid",$clsid) $SharedPrinter.SetAttribute("name",$name) $SharedPrinter.SetAttribute("status",$name) $SharedPrinter.SetAttribute("image",$image) $SharedPrinter.SetAttribute("uid",$uid) $SharedPrinter.SetAttribute("userContext",1) $SharedPrinter.SetAttribute("bypassErrors",1) $SharedPrinterProperties = $SharedPrinter.AppendChild($PrintersGPP.CreateElement("Properties")) $SharedPrinterProperties.setattribute("action",$action) $SharedPrinterProperties.setattribute("comment","") $SharedPrinterProperties.setattribute("path","\\print-cluster-1.common.domain\$name") $SharedPrinterProperties.setattribute("default",0) $SharedPrinterProperties.setattribute("port","") } 

Membuat elemen pemfilteran (penargetan) berdasarkan grup dan subnet:
 Function NewFilterGroup{ [CmdletBinding()] param ( $FilterGroup, $bool = "AND", $not = 0, $name, $sid ) $FilterGroup.SetAttribute("bool",$bool) $FilterGroup.SetAttribute("not",$not) $FilterGroup.SetAttribute("name","COMDOM\"+$name) $FilterGroup.SetAttribute("sid",$sid) $FilterGroup.SetAttribute("userContext",1) } Function NewFilterSubnet{ [CmdletBinding()] param ( $FilterIPRange, $bool = "AND", $not = 0, $start, $end ) $FilterIPRange.SetAttribute("bool",$bool) $FilterIPRange.SetAttribute("not",$not) $FilterIPRange.SetAttribute("min",$start) $FilterIPRange.SetAttribute("max",$end) } 

Ketiga fungsi bekerja secara langsung dengan objek PS yang ditransfer dan tidak mengembalikan apa pun. Catatan untuk perfeksionis: pada saat menulis skrip lebih mudah dan lebih cepat, saya tidak mencoba untuk menulis kode berorientasi objek yang sempurna, saya hanya perlu untuk bekerja. Jadi ya, kodenya memiliki sesuatu untuk diperbaiki, tetapi yang paling penting - ia bekerja!

2.3. Dan akhirnya, loop utama, menambahkan kontrol printer


Dua elemen dibuat untuk setiap printer: satu untuk menambah jika pengguna dalam grup dan subnet, dan satu untuk menghapus printer jika pengguna bukan anggota grup atau pada subnet yang berbeda.

Jika karena alasan tertentu tidak ada UID printer dalam file CSV, itu akan dihasilkan dan ditampilkan di konsol.

Untuk menerjemahkan subnet dari notasi CIDR ke rentang alamat, saya meminjam cmdlet PSipcalc yang bagus.

 ForEach ($PrinterItem in ($PrintersCSV | Sort-Object Name)) { if (!$PrinterItem.uid){ $uid = "{"+([guid]::NewGuid()).Guid.ToUpper()+"}" Write-Host "Printer $($PrinterItem.Name) is new. Policy item ID: $uid" } else { $uid = $PrinterItem.uid } $SharedPrinter = $PrintersGPP.CreateElement("SharedPrinter") NewSharedPrinter -SharedPrinter $SharedPrinter -name $PrinterItem.Name -action "U" -uid $uid $Filters = $SharedPrinter.AppendChild($PrintersGPP.CreateElement("Filters")) if ($PrinterItem.ByGroup -ieq "yes") { try { Get-ADGroup -Identity $PrinterItem.Name | Out-Null } catch { Write-Host "Creating group $($PrinterItem.Name)" New-ADGroup -Name $PrinterItem.Name ` -Path "OU=    ,OU=User Groups,DC=DOM,DC=COM" -GroupScope DomainLocal } $FilterGroup = $PrintersGPP.CreateElement("FilterGroup") NewFilterGroup -FilterGroup $FilterGroup -name $PrinterItem.Name -sid (Get-ADGroup -Identity $PrinterItem.Name).SID.Value $Filters.AppendChild($FilterGroup) | Out-Null } $FilterNetwork = .\PSipcalc.ps1 -NetworkAddress $PrinterItem.Subnet $FilterIPRange = $PrintersGPP.CreateElement("FilterIpRange") NewFilterSubnet -FilterIPRange $FilterIPRange -start $FilterNetwork.HostMin -end $FilterNetwork.HostMax $Filters.AppendChild($FilterIPRange) | Out-Null $Printers.AppendChild($SharedPrinter) | Out-Null $RevertSharedPrinter = $PrintersGPP.CreateElement("SharedPrinter") NewSharedPrinter -SharedPrinter $RevertSharedPrinter -name $PrinterItem.Name -action "D" -uid $uid if ($PrinterItem.ByGroup -ieq "yes") { $bool = "OR" } else { $bool = "AND" } $Filters = $RevertSharedPrinter.AppendChild($PrintersGPP.CreateElement("Filters")) if ($PrinterItem.ByGroup -ieq "yes") { $FilterGroup = $PrintersGPP.CreateElement("FilterGroup") NewFilterGroup -FilterGroup $FilterGroup -name $PrinterItem.Name -sid (Get-ADGroup -Identity $PrinterItem.Name).SID.Value -bool "AND" -not 1 $Filters.AppendChild($FilterGroup) | Out-Null } $FilterIPRange = $PrintersGPP.CreateElement("FilterIpRange") NewFilterSubnet -FilterIPRange $FilterIPRange -start $FilterNetwork.HostMin -end $FilterNetwork.HostMax -bool $bool -not 1 $Filters.AppendChild($FilterIPRange) | Out-Null $Printers.AppendChild($RevertSharedPrinter) | Out-Null } 

2.4. Dan sekarang kita mencetak hasilnya ke file


Saya tidak melihat ada yang salah dengan menabung beberapa menit dan segera menulis ke polis:

 $PrintersGPP.Save("\\COMDOM\SysVol\COMMON.DOMAIN\Policies\{f985a9ae-cb71-468b-8a99-e2c7f428aa2f}\User\Preferences\Printers\Printers.xml") 

3. Menambahkan printer ke server cetak


Windows memiliki serangkaian skrip vbs yang agak tidak dikenal untuk mengelola printer. Selain itu, bahkan dalam versi klien. Terletak di direktori %SystemRoot%\System32\Printing_Admin_Scripts\en-US . Anda dapat membaca Murzilka di sini .

Kami tertarik pada tiga utilitas dari set:

prnport.vbs - untuk membuat port printer di server cetak
prnmngr.vbs - untuk membuat printer itu sendiri
prncnfg.vbs - untuk mengonfigurasi pengaturan dan mengaktifkan berbagi printer
Kami juga membutuhkan utilitas SetACL untuk mengatur hak akses untuk printer.

3.1. Buat printer di server cetak


Untuk melakukan ini, buat skrip CreateRemotePrinter.bat.

Sebagai argumen, diperlukan:
% 1 - Nama printer;
% 2 - Nama pengemudi;
% 3 - Lokasi
% 4 - Deskripsi printer.

 @echo off SET PRTOOLS="c:\Windows\System32\Printing_Admin_Scripts\en-US" SET SETACL="SetACL.exe" cscript /nologo %PRTOOLS%\prnport.vbs -s print-cl-node-1 -a -r %1 -h %1.common.domain -t -o raw -me cscript /nologo %PRTOOLS%\prnmngr.vbs -s print-cl-node-1 -a -p %1 -m %2 -r %1 cscript /nologo %PRTOOLS%\prncnfg.vbs -s print-cl-node-1 -t -p %1 -h %1 -l %3 -m %4 +shared %SETACL% -on \\print-cl-node-1\%1 -ot prn -actn ace -ace "n:STN-TN\%1;p:man_docs,print" 

Dalam kasus umum, ini sudah cukup. Tetapi server cetak kami terletak di kluster MSCS, dan kumpulan skrip vbs di atas tidak berfungsi dengan kluster. Karena itu, sesuatu yang lain perlu dilakukan.

3.2. Mentransfer printer dari server cetak biasa ke server berkerumun


Saat mengakses cluster, skrip dari set di atas cukup membuat port dan printer pada node aktif saat ini, dan mereka tidak muncul di cluster. Hanya untuk kasus seperti itu, Microsoft memiliki alat lain di toko - PrintBRM (Print antrian Backup / Recovery / Migration). Saya tidak menemukan dokumentasi resmi untuknya, jadi saya membagikan apa itu: Bantuan tentang parameter pada SS64 .

Melanjutkan skrip CreateRemotePrinter.bat.

Utilitas PrintBRM dapat dengan benar menyalin konfigurasi printer bersama dengan port ke cluster, namun jika Anda hanya membuat salinan (mulai dengan opsi -b) dan mengembalikan (-r), maka tidak akan ada keajaiban.

Jadi sekarang akan ada sedikit keajaiban. Ini dijelaskan secara rinci di Blog Tim Kinerja MS .
Pertama, kami mencadangkan printer ke file temp.printerexport.

Kemudian kami membongkar subdirektori printerexport, menghapus direktori LMONS dan PRTPROCS, dan juga nol konten dari beberapa file XML. Saya tidak akan merinci, tetapi file-file ini berisi konfigurasi khusus untuk server tertentu dan mengganggu pemulihan printer ke server lain, terutama satu cluster.

Setelah itu, kami kemas konfigurasi yang diedit kembali ke file temp.printerexport dan mengunggahnya ke kluster:

 SET PRNBRM="C:\Windows\System32\spool\tools\PrintBrm.exe" %PRNBRM% -b -nobin -s print-cl-node-1 -f temp.printerexport %PRNBRM% -r -d printerexport -f temp.printerexport del /f /q temp.printerexport del /s /f /q printerexport\LMONS printerexport\PRTPROCS echo ^<SpoolerAttrib /^> > printerexport\BrmSpoolerAttrib.xml echo ^<PPROCS /^> > printerexport\PProcs.xml echo ^<PRINTERDRIVERS /^> > printerexport\BrmDrivers.xml echo ^<LMONS Arch="Windows x64"/^> > printerexport\BRMLMons.xml %PRNBRM% -b -d printerexport -f temp.printerexport del /s /f /q printerexport %PRNBRM% -r -s print-cluster-1 -f temp.printerexport -p all -o force del /f /q temp.printerexport cscript /nologo %PRTOOLS%\prnmngr.vbs -s print-cl-node-1 -d -p %1 cscript /nologo %PRTOOLS%\prnport.vbs -s print-cl-node-1 -d -r %1 

3.3. Tambahkan printer secara bersamaan ke GPP dan server / cluster


Sekarang Anda harus menyesuaikan skrip ini ke dalam daftar printer CSV.

Tambahkan sebelum loop utama permintaan untuk daftar yang ada di server:

 $ActualPrintersList = Get-WmiObject -Class win32_share -computer print-cluster-1 | Where-Object Name -like "*PRN*" | Select-Object -ExpandProperty Name 

Dan di badan loop, jalankan Bat-nickname kami:

  if ("\\print-cluster-1\$($PrinterItem.Name)" -NotIn $ActualPrintersList) { Write-Host "Adding printer $($PrinterItem.Name) to print-cluster-1..." Start-Process -FilePath .\CreateRemotePrinter.bat -ArgumentList "$($PrinterItem.Name) `"$($PrinterItem.Driver)`" `"$($PrinterItem.Location)`" `"$($PrinterItem.Type)`"" -Wait } 

4. Menyatukan semuanya, meluncurkannya, mendapatkan hasilnya


Sumber data dalam CSV
Name;ByGroup;Subnet;Location;Driver;Type;Model;uid
PRN-NALTA-028;yes;192.168.192.0/24;/;HP Universal Printing PCL 6 (v5.6.0); 4 โ€” HP LaserJet Pro M425dn;HP LaserJet Pro M425dn;{35F6CF36-2A24-4A81-B061-8BE71CEC27EA}
PRN-TARUS-002;yes;192.168.128.0/23;/;HP Universal Printing PCL 6 (v5.6.0); 4 โ€” HP LaserJet M3027 MFP;HP LaserJet M3027 MFP;{398F4A94-530C-4E3B-8A30-4288D5E8854D}
PRN-KIRILL-081;;192.168.196.0/24;/;HP Universal Printing PCL 6 (v5.6.0); 4 โ€” HP LaserJet 3390;HP LaserJet 3390;{421FC2DE-2E97-49FC-AEB0-3070B0166AD5}
PRN-BARAB-061;yes;192.168.142.0/24;/;HP Universal Printing PCL 6 (v5.6.0); 4 โ€” HP LaserJet Pro M425dn;HP LaserJet Pro M425dn;{43231EA0-A4A3-4F1A-8A25-95BC4FEFBCC6}
PRN-PYSHM-004;;192.168.143.0/24; /;KX DRIVER for Universal Printing; 4 โ€” Kyocera ECOSYS M2540dn;Kyocera ECOSYS M2540dn;{45509B48-E7BC-4497-9665-86D4E1E96FE1}
PRN-BUY---001;yes;192.168.44.0/24;/;HP Universal Printing PCL 6 (v5.6.0); 4 โ€” HP LaserJet Pro M402dn;HP LaserJet Pro M402dn;{457DB3FE-E35F-450E-B1D6-912F0D831573}
PRN-BATAY-042;yes;192.168.128.0/23;/;HP Universal Printing PCL 6 (v5.6.0); 4 โ€” HP LaserJet P2015 Series;HP LaserJet P2015 Series;{4740604B-C403-4511-91B0-689A197260F3}
PRN-EMPTY-002;yes;192.168.199.0/24;/;HP Universal Printing PCL 6 (v5.6.0); 4 โ€” HP LaserJet Pro M425dn;HP LaserJet Pro M425dn;{475578CB-689F-463B-9710-AE207973146C}
PRN-LIPKI-003;;192.168.44.0/24;/;KX DRIVER for Universal Printing; 4 โ€” Kyocera ECOSYS M2540dn;Kyocera ECOSYS M2540dn;{4794D22E-6586-4A81-A85D-A21FB8B209CF}
PRN-KOTOV-013;yes;192.168.128.0/23;/;HP Universal Printing PCL 6 (v5.6.0); 4 โ€” HP LaserJet Pro M425dn;HP LaserJet Pro M425dn;{4DFFBA1F-48D2-4824-B2EB-0AAD12B6A9D6}
PRN-ELAB-064;;192.168.140.0/24;/;HP Universal Printing PCL 6 (v5.6.0); 4 โ€” HP LaserJet Pro M425dn;HP LaserJet Pro M425dn;{52069D45-EF86-442D-A157-368D7510A1CF}
GeneratePrintersXml.ps1
 $PrintersCSV = Import-Csv -Delimiter ";" ".\Printers.csv" -Encoding Default [System.Xml.XmlDocument]$PrintersGPP = New-Object System.Xml.XmlDocument $PrintersGPP.PrependChild($PrintersGPP.CreateXmlDeclaration("1.0", "utf-8", $null)) | Out-Null $Printers = $PrintersGPP.AppendChild($PrintersGPP.CreateElement("Printers")) $Printers.SetAttribute("clsid","{1F577D12-3D1B-471e-A1B7-060317597B9C}") $DelPrinters = $Printers.AppendChild($PrintersGPP.CreateElement("SharedPrinter")) NewSharedPrinter -SharedPrinter $DelPrinters -name "Delete All" -action "D" -uid "{21097DBD-285D-48C3-B042-7746D7E6DA1B}" $Filters = $DelPrinters.AppendChild($PrintersGPP.CreateElement("Filters")) $FilterRunOnce = $Filters.AppendChild($PrintersGPP.CreateElement("FilterRunOnce")) $FilterRunOnce.SetAttribute("id","{F2537B78-C7D7-43DF-98D6-B32E90644825}") $FilterRunOnce.SetAttribute("hidden",1) $FilterRunOnce.SetAttribute("not",0) $FilterRunOnce.SetAttribute("bool","AND") Function NewSharedPrinter { [CmdletBinding()] param ( $SharedPrinter, $clsid = "{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}", $uid, $name, $action ) $image switch ($action){ "C" {$image = 0} "R" {$image = 1} "U" {$image = 2} "D" {$image = 3} } $SharedPrinter.SetAttribute("clsid",$clsid) $SharedPrinter.SetAttribute("name",$name) $SharedPrinter.SetAttribute("status",$name) $SharedPrinter.SetAttribute("image",$image) $SharedPrinter.SetAttribute("uid",$uid) $SharedPrinter.SetAttribute("userContext",1) $SharedPrinter.SetAttribute("bypassErrors",1) $SharedPrinterProperties = $SharedPrinter.AppendChild($PrintersGPP.CreateElement("Properties")) $SharedPrinterProperties.setattribute("action",$action) $SharedPrinterProperties.setattribute("comment","") $SharedPrinterProperties.setattribute("path","\\print-cluster-1.common.domain\$name") $SharedPrinterProperties.setattribute("default",0) $SharedPrinterProperties.setattribute("port","") } Function NewFilterGroup{ [CmdletBinding()] param ( $FilterGroup, $bool = "AND", $not = 0, $name, $sid ) $FilterGroup.SetAttribute("bool",$bool) $FilterGroup.SetAttribute("not",$not) $FilterGroup.SetAttribute("name","COMDOM\"+$name) $FilterGroup.SetAttribute("sid",$sid) $FilterGroup.SetAttribute("userContext",1) } Function NewFilterSubnet{ [CmdletBinding()] param ( $FilterIPRange, $bool = "AND", $not = 0, $start, $end ) $FilterIPRange.SetAttribute("bool",$bool) $FilterIPRange.SetAttribute("not",$not) $FilterIPRange.SetAttribute("min",$start) $FilterIPRange.SetAttribute("max",$end) } $ActualPrintersList = Get-WmiObject -Class win32_share -computer print-cluster-1 | Where-Object Name -like "*PRN*" | Select-Object -ExpandProperty Name ForEach ($PrinterItem in ($PrintersCSV | Sort-Object Name)) { if (!$PrinterItem.uid){ $uid = "{"+([guid]::NewGuid()).Guid.ToUpper()+"}" Write-Host "Printer $($PrinterItem.Name) is new. Policy item ID: $uid" } else { $uid = $PrinterItem.uid } $SharedPrinter = $PrintersGPP.CreateElement("SharedPrinter") NewSharedPrinter -SharedPrinter $SharedPrinter -name $PrinterItem.Name -action "U" -uid $uid $Filters = $SharedPrinter.AppendChild($PrintersGPP.CreateElement("Filters")) if ($PrinterItem.ByGroup -ieq "yes") { try { Get-ADGroup -Identity $PrinterItem.Name | Out-Null } catch { Write-Host "Creating group $($PrinterItem.Name)" New-ADGroup -Name $PrinterItem.Name ` -Path "OU=    ,OU=User Groups,DC=DOM,DC=COM" -GroupScope DomainLocal } $FilterGroup = $PrintersGPP.CreateElement("FilterGroup") NewFilterGroup -FilterGroup $FilterGroup -name $PrinterItem.Name -sid (Get-ADGroup -Identity $PrinterItem.Name).SID.Value $Filters.AppendChild($FilterGroup) | Out-Null } $FilterNetwork = .\PSipcalc.ps1 -NetworkAddress $PrinterItem.Subnet $FilterIPRange = $PrintersGPP.CreateElement("FilterIpRange") NewFilterSubnet -FilterIPRange $FilterIPRange -start $FilterNetwork.HostMin -end $FilterNetwork.HostMax $Filters.AppendChild($FilterIPRange) | Out-Null $Printers.AppendChild($SharedPrinter) | Out-Null $RevertSharedPrinter = $PrintersGPP.CreateElement("SharedPrinter") NewSharedPrinter -SharedPrinter $RevertSharedPrinter -name $PrinterItem.Name -action "D" -uid $uid if ($PrinterItem.ByGroup -ieq "yes") { $bool = "OR" } else { $bool = "AND" } $Filters = $RevertSharedPrinter.AppendChild($PrintersGPP.CreateElement("Filters")) if ($PrinterItem.ByGroup -ieq "yes") { $FilterGroup = $PrintersGPP.CreateElement("FilterGroup") NewFilterGroup -FilterGroup $FilterGroup -name $PrinterItem.Name -sid (Get-ADGroup -Identity $PrinterItem.Name).SID.Value -bool "AND" -not 1 $Filters.AppendChild($FilterGroup) | Out-Null } $FilterIPRange = $PrintersGPP.CreateElement("FilterIpRange") NewFilterSubnet -FilterIPRange $FilterIPRange -start $FilterNetwork.HostMin -end $FilterNetwork.HostMax -bool $bool -not 1 $Filters.AppendChild($FilterIPRange) | Out-Null $Printers.AppendChild($RevertSharedPrinter) | Out-Null if ("\\print-cluster-1\$($PrinterItem.Name)" -NotIn $ActualPrintersList) { Write-Host "Adding printer $($PrinterItem.Name) to print-cluster-1..." Start-Process -FilePath .\CreateRemotePrinter.bat -ArgumentList "$($PrinterItem.Name) `"$($PrinterItem.Driver)`" `"$($PrinterItem.Location)`" `"$($PrinterItem.Type)`"" -Wait } } $PrintersGPP.Save("\\COMDOM\SysVol\COMMON.DOMAIN\Policies\{f985a9ae-cb71-468b-8a99-e2c7f428aa2f}\User\Preferences\Printers\Printers.xml") $PrintersGPP.Save(".\Printers.xml") 
BuatRemotePrinter.bat
 @echo off SET PRTOOLS="c:\Windows\System32\Printing_Admin_Scripts\en-US" SET SETACL="SetACL.exe" SET PRNBRM="C:\Windows\System32\spool\tools\PrintBrm.exe" cscript /nologo %PRTOOLS%\prnport.vbs -s print-cl-node-1 -a -r %1 -h %1.common.domain -t -o raw -me cscript /nologo %PRTOOLS%\prnmngr.vbs -s print-cl-node-1 -a -p %1 -m %2 -r %1 cscript /nologo %PRTOOLS%\prncnfg.vbs -s print-cl-node-1 -t -p %1 -h %1 -l %3 -m %4 +shared %SETACL% -on \\print-cl-node-1\%1 -ot prn -actn ace -ace "n:STN-TN\%1;p:man_docs,print" %PRNBRM% -b -nobin -s print-cl-node-1 -f temp.printerexport %PRNBRM% -r -d printerexport -f temp.printerexport del /f /q temp.printerexport del /s /f /q printerexport\LMONS printerexport\PRTPROCS echo ^<SpoolerAttrib /^> > printerexport\BrmSpoolerAttrib.xml echo ^<PPROCS /^> > printerexport\PProcs.xml echo ^<PRINTERDRIVERS /^> > printerexport\BrmDrivers.xml echo ^<LMONS Arch="Windows x64"/^> > printerexport\BRMLMons.xml %PRNBRM% -b -d printerexport -f temp.printerexport del /s /f /q printerexport %PRNBRM% -r -s print-cluster-1 -f temp.printerexport -p all -o force del /f /q temp.printerexport cscript /nologo %PRTOOLS%\prnmngr.vbs -s print-cl-node-1 -d -p %1 cscript /nologo %PRTOOLS%\prnport.vbs -s print-cl-node-1 -d -r %1 
File yang dihasilkan Printers.xml
 <?xml version="1.0" encoding="utf-8"?> <Printers clsid="{1F577D12-3D1B-471e-A1B7-060317597B9C}"> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="Delete All" status="Delete All" image="3" uid="{21097DBD-285D-48C3-B042-7746D7E6DA1B}" bypassErrors="1" disabled="1"> <Properties action="D" path="" default="0" deleteAll="1" port="" /> <Filters> <FilterRunOnce id="{F2537B78-C7D7-43DF-98D6-B32E90644825}" hidden="1" not="0" bool="AND" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-BARAB-061" status="PRN-BARAB-061" image="2" uid="{43231EA0-A4A3-4F1A-8A25-95BC4FEFBCC6}" userContext="1" bypassErrors="1"> <Properties action="U" comment="" path="\\print-cluster-1.common.domain\PRN-BARAB-061" default="0" port="" /> <Filters> <FilterGroup bool="AND" not="0" name="COMDOM\PRN-BARAB-061" sid="" userContext="1" /> <FilterIpRange bool="AND" not="0" min="192.168.142.1" max="192.168.142.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-BARAB-061" status="PRN-BARAB-061" image="3" uid="{43231EA0-A4A3-4F1A-8A25-95BC4FEFBCC6}" userContext="1" bypassErrors="1"> <Properties action="D" comment="" path="\\print-cluster-1.common.domain\PRN-BARAB-061" default="0" port="" /> <Filters> <FilterGroup bool="AND" not="1" name="COMDOM\PRN-BARAB-061" sid="" userContext="1" /> <FilterIpRange bool="OR" not="1" min="192.168.142.1" max="192.168.142.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-BATAY-042" status="PRN-BATAY-042" image="2" uid="{4740604B-C403-4511-91B0-689A197260F3}" userContext="1" bypassErrors="1"> <Properties action="U" comment="" path="\\print-cluster-1.common.domain\PRN-BATAY-042" default="0" port="" /> <Filters> <FilterGroup bool="AND" not="0" name="COMDOM\PRN-BATAY-042" sid="" userContext="1" /> <FilterIpRange bool="AND" not="0" min="192.168.128.1" max="192.168.129.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-BATAY-042" status="PRN-BATAY-042" image="3" uid="{4740604B-C403-4511-91B0-689A197260F3}" userContext="1" bypassErrors="1"> <Properties action="D" comment="" path="\\print-cluster-1.common.domain\PRN-BATAY-042" default="0" port="" /> <Filters> <FilterGroup bool="AND" not="1" name="COMDOM\PRN-BATAY-042" sid="" userContext="1" /> <FilterIpRange bool="OR" not="1" min="192.168.128.1" max="192.168.129.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-BUY---001" status="PRN-BUY---001" image="2" uid="{457DB3FE-E35F-450E-B1D6-912F0D831573}" userContext="1" bypassErrors="1"> <Properties action="U" comment="" path="\\print-cluster-1.common.domain\PRN-BUY---001" default="0" port="" /> <Filters> <FilterGroup bool="AND" not="0" name="COMDOM\PRN-BUY---001" sid="" userContext="1" /> <FilterIpRange bool="AND" not="0" min="192.168.44.1" max="192.168.44.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-BUY---001" status="PRN-BUY---001" image="3" uid="{457DB3FE-E35F-450E-B1D6-912F0D831573}" userContext="1" bypassErrors="1"> <Properties action="D" comment="" path="\\print-cluster-1.common.domain\PRN-BUY---001" default="0" port="" /> <Filters> <FilterGroup bool="AND" not="1" name="COMDOM\PRN-BUY---001" sid="" userContext="1" /> <FilterIpRange bool="OR" not="1" min="192.168.44.1" max="192.168.44.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-ELAB-064" status="PRN-ELAB-064" image="2" uid="{52069D45-EF86-442D-A157-368D7510A1CF}" userContext="1" bypassErrors="1"> <Properties action="U" comment="" path="\\print-cluster-1.common.domain\PRN-ELAB-064" default="0" port="" /> <Filters> <FilterIpRange bool="AND" not="0" min="192.168.140.1" max="192.168.140.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-ELAB-064" status="PRN-ELAB-064" image="3" uid="{52069D45-EF86-442D-A157-368D7510A1CF}" userContext="1" bypassErrors="1"> <Properties action="D" comment="" path="\\print-cluster-1.common.domain\PRN-ELAB-064" default="0" port="" /> <Filters> <FilterIpRange bool="AND" not="1" min="192.168.140.1" max="192.168.140.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-EMPTY-002" status="PRN-EMPTY-002" image="2" uid="{475578CB-689F-463B-9710-AE207973146C}" userContext="1" bypassErrors="1"> <Properties action="U" comment="" path="\\print-cluster-1.common.domain\PRN-EMPTY-002" default="0" port="" /> <Filters> <FilterGroup bool="AND" not="0" name="COMDOM\PRN-EMPTY-002" sid="" userContext="1" /> <FilterIpRange bool="AND" not="0" min="192.168.199.1" max="192.168.199.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-EMPTY-002" status="PRN-EMPTY-002" image="3" uid="{475578CB-689F-463B-9710-AE207973146C}" userContext="1" bypassErrors="1"> <Properties action="D" comment="" path="\\print-cluster-1.common.domain\PRN-EMPTY-002" default="0" port="" /> <Filters> <FilterGroup bool="AND" not="1" name="COMDOM\PRN-EMPTY-002" sid="" userContext="1" /> <FilterIpRange bool="OR" not="1" min="192.168.199.1" max="192.168.199.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-KIRILL-081" status="PRN-KIRILL-081" image="2" uid="{421FC2DE-2E97-49FC-AEB0-3070B0166AD5}" userContext="1" bypassErrors="1"> <Properties action="U" comment="" path="\\print-cluster-1.common.domain\PRN-KIRILL-081" default="0" port="" /> <Filters> <FilterIpRange bool="AND" not="0" min="192.168.196.1" max="192.168.196.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-KIRILL-081" status="PRN-KIRILL-081" image="3" uid="{421FC2DE-2E97-49FC-AEB0-3070B0166AD5}" userContext="1" bypassErrors="1"> <Properties action="D" comment="" path="\\print-cluster-1.common.domain\PRN-KIRILL-081" default="0" port="" /> <Filters> <FilterIpRange bool="AND" not="1" min="192.168.196.1" max="192.168.196.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-KOTOV-013" status="PRN-KOTOV-013" image="2" uid="{4DFFBA1F-48D2-4824-B2EB-0AAD12B6A9D6}" userContext="1" bypassErrors="1"> <Properties action="U" comment="" path="\\print-cluster-1.common.domain\PRN-KOTOV-013" default="0" port="" /> <Filters> <FilterGroup bool="AND" not="0" name="COMDOM\PRN-KOTOV-013" sid="" userContext="1" /> <FilterIpRange bool="AND" not="0" min="192.168.128.1" max="192.168.129.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-KOTOV-013" status="PRN-KOTOV-013" image="3" uid="{4DFFBA1F-48D2-4824-B2EB-0AAD12B6A9D6}" userContext="1" bypassErrors="1"> <Properties action="D" comment="" path="\\print-cluster-1.common.domain\PRN-KOTOV-013" default="0" port="" /> <Filters> <FilterGroup bool="AND" not="1" name="COMDOM\PRN-KOTOV-013" sid="" userContext="1" /> <FilterIpRange bool="OR" not="1" min="192.168.128.1" max="192.168.129.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-LIPKI-003" status="PRN-LIPKI-003" image="2" uid="{4794D22E-6586-4A81-A85D-A21FB8B209CF}" userContext="1" bypassErrors="1"> <Properties action="U" comment="" path="\\print-cluster-1.common.domain\PRN-LIPKI-003" default="0" port="" /> <Filters> <FilterIpRange bool="AND" not="0" min="192.168.44.1" max="192.168.44.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-LIPKI-003" status="PRN-LIPKI-003" image="3" uid="{4794D22E-6586-4A81-A85D-A21FB8B209CF}" userContext="1" bypassErrors="1"> <Properties action="D" comment="" path="\\print-cluster-1.common.domain\PRN-LIPKI-003" default="0" port="" /> <Filters> <FilterIpRange bool="AND" not="1" min="192.168.44.1" max="192.168.44.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-NALTA-028" status="PRN-NALTA-028" image="2" uid="{35F6CF36-2A24-4A81-B061-8BE71CEC27EA}" userContext="1" bypassErrors="1"> <Properties action="U" comment="" path="\\print-cluster-1.common.domain\PRN-NALTA-028" default="0" port="" /> <Filters> <FilterGroup bool="AND" not="0" name="COMDOM\PRN-NALTA-028" sid="" userContext="1" /> <FilterIpRange bool="AND" not="0" min="192.168.192.1" max="192.168.192.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-NALTA-028" status="PRN-NALTA-028" image="3" uid="{35F6CF36-2A24-4A81-B061-8BE71CEC27EA}" userContext="1" bypassErrors="1"> <Properties action="D" comment="" path="\\print-cluster-1.common.domain\PRN-NALTA-028" default="0" port="" /> <Filters> <FilterGroup bool="AND" not="1" name="COMDOM\PRN-NALTA-028" sid="" userContext="1" /> <FilterIpRange bool="OR" not="1" min="192.168.192.1" max="192.168.192.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-PYSHM-004" status="PRN-PYSHM-004" image="2" uid="{45509B48-E7BC-4497-9665-86D4E1E96FE1}" userContext="1" bypassErrors="1"> <Properties action="U" comment="" path="\\print-cluster-1.common.domain\PRN-PYSHM-004" default="0" port="" /> <Filters> <FilterIpRange bool="AND" not="0" min="192.168.143.1" max="192.168.143.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-PYSHM-004" status="PRN-PYSHM-004" image="3" uid="{45509B48-E7BC-4497-9665-86D4E1E96FE1}" userContext="1" bypassErrors="1"> <Properties action="D" comment="" path="\\print-cluster-1.common.domain\PRN-PYSHM-004" default="0" port="" /> <Filters> <FilterIpRange bool="AND" not="1" min="192.168.143.1" max="192.168.143.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-TARUS-002" status="PRN-TARUS-002" image="2" uid="{398F4A94-530C-4E3B-8A30-4288D5E8854D}" userContext="1" bypassErrors="1"> <Properties action="U" comment="" path="\\print-cluster-1.common.domain\PRN-TARUS-002" default="0" port="" /> <Filters> <FilterGroup bool="AND" not="0" name="COMDOM\PRN-TARUS-002" sid="" userContext="1" /> <FilterIpRange bool="AND" not="0" min="192.168.128.1" max="192.168.129.254" /> </Filters> </SharedPrinter> <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="PRN-TARUS-002" status="PRN-TARUS-002" image="3" uid="{398F4A94-530C-4E3B-8A30-4288D5E8854D}" userContext="1" bypassErrors="1"> <Properties action="D" comment="" path="\\print-cluster-1.common.domain\PRN-TARUS-002" default="0" port="" /> <Filters> <FilterGroup bool="AND" not="1" name="COMDOM\PRN-TARUS-002" sid="" userContext="1" /> <FilterIpRange bool="OR" not="1" min="192.168.128.1" max="192.168.129.254" /> </Filters> </SharedPrinter> </Printers> 
Hasil pada server cetak
gambar

Source: https://habr.com/ru/post/id421211/


All Articles