Menyebarkan Printer melalui GPO / GPP - apakah ada opsi terprogram?

10

Untuk alasan di luar kendali saya, saya telah ditugaskan untuk menyiapkan GPO / GPP untuk menyebarkan 100+ printer kami ke 1000+ klien kami.

Berita baiknya adalah kami memiliki lebih dari selusin situs, dan sebagian besar, saya diizinkan untuk mendorong semua printer di situs X ke semua PC klien di situs X.

Berita buruknya adalah bahwa dua cara saya tahu bagaimana melakukannya ( "Menyebarkan dengan Kebijakan Grup ...", dari server cetak " dan menggunakan GPP / Group Policy Preferences ) melibatkan jauh lebih banyak pekerjaan manual daripada yang saya bersedia untuk ini banyak printer. Saya bahkan tidak bisa memilih semua printer di server cetak dan menggunakan Deploy with Group Policy...opsi, misalnya - saya berharap untuk melakukan itu satu per satu, yang tidak akan terjadi. GPP lebih buruk lagi , seperti yang saya harapkan untuk memilih jalur printer dari server cetak dan kemudian secara manual memasukkan banyak informasi (seperti IP printer) yang seharusnya dapat diperoleh dari koneksi printer.

Google-Fu saya untuk skrip untuk menambahkan semua printer pada server cetak ke GPO / GPP muncul kosong, dan saya sepertinya tidak bisa melihat cara lain untuk melakukan ini bahkan dengan mode semi-otomatis, tapi saya bertahan dengan keyakinan bahwa saya kehilangan sesuatu, karena tidak mungkin orang waras akan memilih untuk secara manual menambahkan ratusan printer ke dalam GPO.

Idealnya, saya ingin mencari cara terprogram untuk menggunakan GPP, tetapi dalam situasi tersebut, solusi apa pun yang tidak melibatkan puluhan jam menambahkan printer secara manual akan sangat bagus.

Apakah ada yang punya cara untuk melakukan ini, atau saya perlu membuat skrip PowerShell dan / atau menipu bawahan untuk melakukan ini?

HopelessN00b
sumber
1
Seperti yang saya sebutkan kepada Anda dalam obrolan sebelumnya hari ini, ada antarmuka COM untuk pemrograman membuat dan menghubungkan GPO ... semua dimulai dengan sesuatu seperti $GPM = New-Object -ComObject GPMgmt.Gpm. Saya pikir antarmuka itu, walaupun menjadi babi mutlak untuk dikerjakan, mungkin memberi Anda metode yang sedikit lebih mendukung daripada sekadar meretas beberapa XML yang tampak dan berbau seperti GPO asli. Tidak ada yang suka COM. Paling tidak dari semua yang kami Powershellers.
Ryan Ries
1
@RyanRies Ya, saya masih memikirkannya, dan salah satu hal yang belum saya putuskan adalah apakah skrip saya perlu didukung atau tidak, atau hanya satu kali hal untuk mengaturnya di tempat pertama. Cukup yakin saya akan memposting di sini, apa pun yang akhirnya saya lakukan.
HopelessN00b
Ketika Anda mengatakan Anda perlu menggunakan 100 printer, bukan berarti semua komputer (1..1000) harus memiliki 100 printer, bukan?
Adil Hindistan
1
@AdilHindistan No. Setiap komputer harus mendapatkan semua printer yang tersedia di situsnya. (Lebih atau kurang.) Tetapi memisahkan mereka bukanlah bagian yang sulit. Ini membuat printer menjadi GPO di tempat pertama yang ternyata lebih menyusahkan daripada yang Anda pikir seharusnya.
HopelessN00b

Jawaban:

7

Saya googled cukup keras, dan bahkan bermain-main dengan backup-GPOharapan bisa meretas file XML yang dihasilkan dan menggantinya, tetapi saya curiga bahwa skrip PowerShell ada di masa depan Anda.

Tidak seburuk itu. Anda dapat membuat daftar printer dari server terdekat dan kemudian mengulanginya dan memetakannya.

Sesuatu seperti ini:

$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)
}

Jika printer dinamai hal-hal yang logis, dan ada beberapa cara logis untuk mengidentifikasi mesin, Anda mungkin dapat memperbaikinya lagi. Saya biasa memilih server terdekat berdasarkan menarik alamat IP klien, misalnya. Jika alamat IP seperti 10.20. *, Buka server1. Dll

Saya harap itu membantu.

Edit:

Melihat dokumentasi @ EvanAnderson, saya cukup yakin bahwa XML dapat diretas.

Sedikit file saya yang diekspor (dengan redaksi) yang relevan:

<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>
Katherine Villyard
sumber
Ini jawaban yang bagus (dan saya mungkin akan menggunakan sesuatu seperti ini untuk memenuhi tenggat waktu kami), tapi saya curiga magang atau bawahan ada di masa depan pertanyaan ini, sebenarnya, karena kita diharuskan menggunakan GPO / GPP untuk ditugaskan printer di beberapa titik. Dan sementara skrip logon PS secara teknis akan sesuai dengan persyaratan itu, saya berharap bahwa manajemen akan cukup pada saya untuk membuatnya tidak layak saat saya melakukannya dengan cara itu.
HopelessN00b
Sayang. :( Cmdlet GPO powershell tampaknya mencadangkan, memulihkan, membuat objek kosong ... tetapi tidak menambah GPO. Objek XML yang memiliki kebijakan printer terlihat sepenuhnya dapat diretas kecuali untuk GUID.
Katherine Villyard
1
Ya, tanpa alat pihak ke-3, otomatisasi GPO / GPP via PowerShell cukup menyakitkan. Saya menemukan sesuatu yang terlihat cukup bagus , simpan untuk fakta bahwa itu membutuhkan perangkat lunak pihak ke-3 yang mungkin tidak akan diizinkan untuk dibeli ... jadi mungkin ada beberapa skrip seperti Anda untuk mengedit XML di situs yang ada khusus situs yang ada GPO ... yang saya bayangkan akan saya posting di sini setelah saya selesai.
HopelessN00b
8

Menurut pendapat saya, manajemen Powershell Kebijakan Grup menyebalkan tanpa produk pihak ketiga (komersial).

Saya pikir Anda terjebak slinging melalui XML (atau dalam HTML jika Anda suka ) di Objek Kebijakan Grup untuk melakukan apa yang Anda cari.

Untungnya XML tidak terlihat menakutkan . Nilai UID per-printer (yang saya percaya adalah yang dimaksud oleh @KatherineVillyard dalam komentarnya) hanyalah GUID acak yang dibuat untuk setiap printer yang direferensikan dalam XML.

Berikut ini beberapa contoh kode Powershell, yang dimodelkan dengan tanpa malu-malu setelah kode 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>
"@

(Saya menulis kode Powershell yang benar-benar jelek.)

Saya belum benar-benar mencoba agar GPP CSE mem-parsing XML ini. XML setidaknya memvalidasi.

Saya mulai berpikir tentang menulis beberapa monstrositas menggunakan Get-GPOdan menguraikan GUID untuk sampai ke jalur sistem file untuk GPO di SYSVOL tetapi, mengingat bahwa saya perlu melakukan beberapa pekerjaan nyata malam ini, saya pikir saya akan pergi itu sebagai latihan untuk pembaca. > tersenyum <Namun, itu seharusnya sangat layak.

Evan Anderson
sumber
Jika itu adalah GUID acak, itu pasti bisa diretas. Saya baru saja memperbarui milik saya juga. Heh.
Katherine Villyard
Memodifikasi XML dalam cadangan Kebijakan Grup tentu akan berhasil, tetapi mengubahnya "langsung" di SYSVOL juga harus layak (asalkan orang itu berani, bodoh, atau, seperti saya, keduanya). Karena saya punya pekerjaan nyata yang harus dilakukan malam ini (dan karena saya kembali ke @ewwhite untuk peringkat rep kuarter ini lagi) saya pikir saya akan menghemat memuat senjata itu dan mengarahkannya ke kaki mereka untuk orang lain. > tawa <
Evan Anderson
Saya berani, tapi saya tidak seberani itu. ;) Hasilkan file, uji impor di lingkungan pengujian, dll.
Katherine Villyard
2
Powershell benar-benar membutuhkan lebih banyak opsi GPO. Get-Link, Set-Link, New-GPO dan Set-GPORegistry tidak cukup bagus ...
Mark Henderson
Perintah PowerShell bawaan terkadang tidak cukup. Dalam hal ini, saya akan menyarankan untuk melihat solusi 'The GPO Guy. Dia memiliki perusahaan: sdmsoftware.com
Adil
0

Saya baru-baru ini melakukan proyek serupa dan setelah melihat ke dalam metode push GPO yang bagus vs GPP yang lebih baru vs scripting, saya memilih untuk menulis semuanya. Saya tidak tahu apa yang terbaik untuk Anda, tetapi berikut adalah beberapa petunjuk untuk Anda:

  • Idealnya gunakan klien dengan OS baru (Windows 8/2012 +) untuk terhubung ke server cetak dan mendapatkan informasi Printer dari Server Cetak:

    Get-Printer -Computer PrintServerName

  • Gunakan grup Keamanan AD untuk memetakan antrian cetak ke komputer. Jadi misalkan Anda memiliki antrian cetak (Anda berkumpul dari perintah di atas) bernama \ PrintServer1 \ MyColorPrinter123, buat grup keamanan seperti printer.group.PrintServer1.MyColorPrinter123, dan tambahkan komputer ke grup itu

  • Dalam skrip startup, memiliki fungsi untuk memeriksa keanggotaan grup komputer saat akan muncul, dan melihat apakah itu merupakan bagian dari grup printer apa pun. Jika ya, gunakan perintah printui.exe (atau printui.dll) bawaan untuk memetakan printer seperti ini

    Invoke-Expression 'rundll32 printui.dll, PrintUIEntry / ga / n "\ PrintServer1 \ MyColorPrinter123" / q'

  • Setelah komputer menyala, layanan spooler cetak itu akan mendorong 'koneksi cetak', yang biasa dilakukan GPO, kepada setiap pengguna yang akan masuk.

Anda bisa menjadi jauh lebih detail ** tetapi pada level tinggi itulah yang dibutuhkan.

** Saya membuat GUI yang memungkinkan pengguna (benar-benar teknisi) untuk memilih Print Server, dan memberi mereka daftar printer di server itu. Jika mereka memilih satu, mereka dapat melihat semua properti itu. Info itu berasal dari Get-Printer yang saya sebutkan di atas. Jika Anda mengekspor data itu sebagai csv, Anda dapat menggunakannya kembali untuk menampilkan informasi ..

** Teknisi menggunakan GUI itu untuk mengirim permintaan untuk menambahkan komputer ke printer yang seharusnya terhubung. Ini adalah 'permintaan', tetapi mereka tidak memiliki izin dalam AD.

** Skrip backend sederhana menonton folder dan menambahkan komputer ke grup printer yang saya sebutkan di atas. Jadi, jika Anda sudah tahu siapa yang harus mendapatkan printer mana, hebat, Anda bisa dengan mudah melakukannya. Menambahkan komputer ke grup adalah pekerjaan mudah dengan Cmdlet AD.

** Anda juga dapat menjadwalkan pekerjaan untuk memeriksa server cetak untuk melihat apakah ada antrian cetak baru, dan membandingkannya dengan Anda grup AD.

Jadi, menciptakan solusi yang 'terkelola' sedikit terlibat, tetapi mudah untuk memulai dengan dasar-dasar dan terus menambahkan untuk memiliki sistem yang sangat fleksibel, mudah digunakan yang tidak melibatkan GPO ... hanya sedikit PowerShell

Adil Hindistan
sumber