Yazıcıları GPO / GPP ile Dağıtma - programlı bir seçenek var mı?


10

Kontrolüm dışındaki nedenlerden ötürü, 100'den fazla yazıcımızı 1000'den fazla istemcimize dağıtmak için GPO / GPP'ler kurmakla görevlendirildim.

İyi haber şu ki, bir düzineden fazla sitemiz var ve çoğunlukla X sitesindeki tüm yazıcıları X sitesindeki tüm istemci bilgisayarlara göndermeme izin verildi.

Kötü haber şu ki, bunu nasıl yapacağımı bildiğim iki yol ( "Grup İlkesi ile Dağıt ...", baskı sunucusundan " ve GPP / Grup İlkesi Tercihleri'ni kullanmak ), istediğimden çok daha fazla manuel çalışma içeriyor Bir yazdırma sunucusundaki tüm yazıcıları seçemiyorum ve seçeneği kullanamıyorum bile Deploy with Group Policy..., örneğin - bunu tek tek yapmamı bekliyor, gerçekleşmeyecek. GPP'ler daha da kötü , yazıcı sunucusundan bir yazıcının yolunu seçmemi ve ardından yazıcı bağlantısından alabilmesi gereken bir grup bilgiyi (yazıcı IP'si gibi) elle delmemi beklediğinden.

Bir baskı sunucusundaki tüm yazıcıları GPO / GPP'ye eklemek için bir komut dosyası için Google-Fu'm boş çıktı ve bunu yarı otomatik bir şekilde bile yapmanın başka bir yolunu göremiyorum, ama yapışıyorum bir şey eksik olduğum inancıyla, çünkü aklı başında bir insanın GPO'lara elle yüzlerce yazıcı eklemeyi seçmesinin bir yolu yok.

İdeal olarak, GPP'leri kullanmanın programlı bir yolunu bulmak isterim, ancak koşullar altında, düzinelerce saat elle yazıcı eklemeyi içermeyen herhangi bir çözüm sadece harika olurdu.

Herkes bunu yapmak için bir yolu var mı, ya da bir PowerShell komut dosyası oluşturmak ve / veya bunu yapmak için bir bağımlı kandırmak gerekir mi?


1
Bugün daha önce sohbet ederken size bahsettiğim gibi, GPO'ları programlı olarak oluşturmak ve bağlamak için bir COM arayüzü var ... hepsi gibi bir şeyle başlıyor $GPM = New-Object -ComObject GPMgmt.Gpm. Arayüzün çalışmak için mutlak bir domuz olmasına rağmen, size gerçek bir GPO gibi görünen ve kokan bazı XML'leri hacklemekten biraz daha desteklenebilir bir yöntem sağlayabileceğini düşünüyorum. Kimse COM sevmiyor. Biz en az Powershellers.
Ryan Ries

1
@RyanRies Evet, hala aklımda bir mermi atıyorum ve karar vermediğim şeylerden biri, komut dosyamın desteklenebilir olması gerekip gerekmediği ya da ilk yer. Sonunda ne yaparsam yapayım, buraya göndereceğime eminim.
HopelessN00b

100 yazıcı dağıtmanız gerektiğini söylediğinizde, tüm bilgisayarların (1..1000) 100 yazıcıya sahip olması gerektiği anlamına gelmez, değil mi?
Adil Hindistan

1
Her bilgisayarın kendi sitesinde bulunan tüm yazıcıları edinmesi gerekir. (Az ya da çok.) Ama onları ayırmak zor değil. İlk etapta yazıcıları GPO'lara dönüştürüyor ve olması gerekenden daha fazla acı oluyor.
HopelessN00b

Yanıtlar:


7

Oldukça zor bir şekilde çalıştım backup-GPOve sonuçta ortaya çıkan XML dosyasını hackleyip yeniden içe aktarma umuduyla bile oynadım , ancak gelecekteki bir PowerShell betiğinin olduğundan şüpheleniyorum.

O kadar da kötü değil. Yazıcı listesini en yakın sunucudan oluşturabilir ve daha sonra bu listeye girip eşleyebilirsiniz.

Bunun gibi bir şey:

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

Yazıcılara mantıksal şeyler adı veriliyorsa ve makineleri tanımlamanın mantıklı bir yolu varsa, onu daha da hassaslaştırabilirsiniz. Örneğin, istemci IP adresini çekerek en yakın sunucuyu seçerdim. IP adresi 10.20. * İse, sunucu1'e gidin. Vb.

Umarım bu yardımcı olur.

Düzenle:

@ EvanAnderson'ın belgelerine baktığımda XML'in hacklenebilir olduğundan eminim.

Dışa aktarılan dosyamın ilgili kısmı (düzeltmelerle birlikte):

<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>

Bu iyi bir cevap (ve bazı son tarihlerimizi karşılamak için böyle bir şey kullanabilirim), ancak bir stajyer veya astın bu sorunun geleceğinde olduğundan şüpheleniyorum çünkü aslında GPO'ları / GPP'leri atamak için gerekliyiz bir noktada yazıcılar. Ve bir PS oturum açma komut dosyası teknik olarak bu gereksinimi karşılasa da, yönetimin bana bu şekilde yapmaya zamanımı değmeyecek kadar iyi birleşmesini bekliyorum.
HopelessN00b

Ne yazık ki. . :( GPO davranırlar GPO'lara eklemek yedekleme, geri yükleme, boş nesneler oluşturmak ... ama görünüyor yazıcı politikaları bakmasını XML nesneleri PowerShell tamamen . GUID'ye haricinde hackable
Katherine Villyard

1
Evet, 3. taraf araçları olmadan, PowerShell üzerinden GPO / GPP otomasyonu oldukça acı verici. Oldukça iyi görünen bir şey buldum , muhtemelen satın almamıza izin verilmeyecek bir 3. taraf yazılım paketi gerektirdiği gerçeği için tasarruf ettim ... GPO'lar ... bitirdikten sonra buraya göndereceğimi hayal ediyorum.
HopelessN00b

8

Grup Politikasının Powershell yönetimi bence üçüncü taraf (ticari) ürünler olmadan berbat .

Aradığınızı yapmak için Grup İlkesi Nesneleri'nde XML'de (veya isterseniz HTML'de ) saplanıp kaldığınızı düşünüyorum .

Neyse ki XML dehşet verici görünmüyor . Yazıcı başına UID değeri (ki @KatherineVillyard'ın yorumunda atıfta bulunduğu şey olduğuna inanıyorum), XML'de referans verilen her yazıcı için oluşturulan rastgele bir GUID'dir.

Katherine kodundan sonra utanmadan modellenen bazı örnek Powershell kodu:

@"
<?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>
"@

(Gerçekten, gerçekten çirkin Powershell kodu yazıyorum.)

Aslında GPP CSE bu XML ayrıştırmak için çalışmadım. XML en azından doğrular.

SYSVOL'deki Get-GPOGPO için dosya sistemi yoluna ulaşmak için GUID'i kullanarak ve ayrıştırmak için bazı canavarlıklar yazmaya başladım, ancak, bu akşam gerçek bir iş yapmam gerektiğinden, ayrılacağımı düşünüyorum okuyucu için bir alıştırma olarak. > smile <Yine de oldukça uygulanabilir olmalıdır.


Rastgele bir GUID ise, kesinlikle hacklenebilir. Benimkini de güncelledim. Heh.
Katherine Villyard

Bir Grup İlkesi yedeklemesinde XML'i değiştirmek kesinlikle işe yarayacaktır, ancak SYSVOL'da "canlı" olarak değiştirilmesi de mümkün olmalıdır (biri cesur, aptal ya da benim gibi her ikisi de). Bu akşam yapmak için gerçek bir işim olduğundan (ve bu çeyrekte tekrar sıralamalar için @beyazdan döndüğümden beri), bu silahı yüklemeyi ve başka biri için ayaklarına işaret etmeyi düşünüyorum. > kıkırdama <
Evan Anderson

Cesurum ama o kadar cesur değilim. ;) Dosya oluşturun, test ortamında test edin, vb.
Katherine Villyard

2
Powershell gerçekten daha fazla GPO seçeneğine ihtiyaç duyuyor. Get-Link, Set-Link, Yeni GPO ve Set-GPORegistry gerçekten yeterince iyi değil ...
Mark Henderson

Yerleşik PowerShell komutları bazen yeterli olmaz. Bu durumda, 'GPO Guy'ın çözümlerine bakmanızı öneririm. Bir şirketi var: sdmsoftware.com
Adil Hindistan

0

Son zamanlarda benzer bir proje üstlendim ve daha iyi GPP'ye karşı komut dosyası yazımına karşı iyi ol GPO push yöntemine baktıktan sonra, her şeyi senaryo yazmayı seçtim. Sizin için en iyi neyin işe yarayacağına dair hiçbir fikrim yok ama işte size birkaç ipucu:

  • Yazdırma sunucularına bağlanmak ve Yazıcı Bilgilerini Yazdırma Sunucularından almak için yeni bir işletim sistemine sahip bir istemciyi (Windows 8/2012 +) kullanın:

    Get-Printer-bilgisayar PrintServerName

  • Yazdırma kuyruklarını bilgisayarlarla eşlemek için AD Güvenlik gruplarını kullanın. Diyelim ki \ PrintServer1 \ MyColorPrinter123 adlı bir yazdırma kuyruğunuz var (yukarıdaki komuttan topladınız), printer.group.PrintServer1.MyColorPrinter123 gibi bir güvenlik grubu oluşturun ve bilgisayarları bu gruba ekleyin

  • Başlangıç ​​komut dosyasında, bilgisayarın grup üyeliğini kontrol etme ve herhangi bir yazıcı grubunun parçası olup olmadığını kontrol etme işlevine sahip olun. Öyleyse, yazıcıyı bu şekilde eşlemek için yerleşik printui.exe (veya printui.dll) komutlarını kullanın

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

  • Bilgisayar açıldığında, bu yazdırma biriktirici hizmeti, GPO'ların yaptığı şey olan 'yazdırma bağlantısını' oturum açacak herhangi bir kullanıcıya iletir.

Çok daha detaylı ** yapabilirsiniz, ancak yüksek düzeyde gereken budur.

** Kullanıcıların (gerçekten) herhangi bir Yazdırma Sunucusunu seçmelerine izin veren bir GUI oluşturdum ve bu sunucudaki yazıcıların listesini veriyor. Birini seçerse, tüm özelliklerini görebilirler. Bu bilgi yukarıda bahsettiğim Get-Printer'dan geliyor. Bu verileri csv olarak dışa aktarırsanız, bilgileri görüntülemek için yeniden kullanabilirsiniz.

** Teknikler bu GUI'yi, bağlanması gereken yazıcılara bilgisayar ekleme isteği göndermek için kullanır. Bu bir 'istek', b / c AD'de izinleri yok.

** Basit bir arka uç komut dosyası klasörü izler ve bilgisayarı yukarıda bahsettiğim yazıcı grubuna ekler. Yani, kimin hangi yazıcıyı alması gerektiğini zaten biliyorsanız, harika, kolayca yapabilirsiniz. Gruplara bilgisayar eklemek, AD Cmdlet'leri ile basit bir iştir.

** Yeni bir yazdırma kuyruğu olup olmadığını görmek için yazdırma sunucularını kontrol etmek üzere bir iş zamanlayabilir ve bunları AD gruplarınızla karşılaştırabilirsiniz.

Bu nedenle, 'yönetilen' bir çözüm oluşturmak biraz dahil, ancak temel bilgilerle başlamak ve GPO içermeyen çok esnek, kullanımı kolay bir sisteme sahip olmaya devam etmek kolaydır ... sadece biraz PowerShell

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.