Implantando impressoras via GPO / GPP - existe uma opção programática?

10

Por motivos fora do meu controle, fui encarregado de configurar GPO / GPPs para implantar mais de 100 impressoras em mais de 1000 clientes.

A boa notícia é que temos mais de uma dúzia de sites e, na maior parte, tenho permissão para enviar todas as impressoras no site X a todos os PCs clientes no site X.

A má notícia é que as duas maneiras pelas quais sei fazê-lo ( "Implantar com a Diretiva de Grupo ...", do servidor de impressão " e usar as Preferências da Diretiva de Grupo / GPP ) envolvem muito mais trabalho manual do que estou disposto a fazer. Parece que não consigo selecionar todas as impressoras em um servidor de impressão e usar a Deploy with Group Policy...opção, por exemplo - ela espera que eu faça isso uma a uma, o que não vai acontecer.Os GPPs são ainda piores , pois espera que eu selecione o caminho de uma impressora no servidor de impressão e insira manualmente um monte de informações (como o IP da impressora) que ela poderá obter da conexão da impressora.

Meu Google-Fu para um script para adicionar todas as impressoras em um servidor de impressão a um GPO / GPP ficou vazio, e parece que não vejo outra maneira de fazer isso, mesmo de maneira semi-automatizada, mas estou insistindo com a crença de que estou perdendo alguma coisa, porque nenhuma pessoa sã escolheria adicionar manualmente centenas de impressoras aos GPOs.

Idealmente, eu gostaria de encontrar uma maneira programática de usar os GPPs, mas nessas circunstâncias, qualquer solução que não envolva dezenas de horas adicionando impressoras manualmente seria ótima.

Alguém tem uma maneira de fazer isso ou vou precisar criar um script do PowerShell e / ou induzir um subordinado a fazer isso?

HopelessN00b
fonte
1
Como mencionei a você no bate-papo hoje, existe uma interface COM para criar e vincular programaticamente GPOs ... tudo começando com algo parecido $GPM = New-Object -ComObject GPMgmt.Gpm. Eu acho que essa interface, apesar de ser um porco absoluto para se trabalhar, pode fornecer um método um pouco mais suportável do que simplesmente invadir algum XML que sai parecendo e cheirando como um GPO real. Ninguém gosta de COM embora. Menos de todos nós, Powershellers.
Ryan Ries
1
@RyanRies Sim, ainda estou pensando em uma rodada e uma das coisas que ainda não decidi é se meu script precisa ou não ser suportado ou apenas uma coisa única para configurá-lo no primeiro lugar. Tenho certeza de que vou postar aqui, o que quer que eu acabe fazendo.
HopelessN00b
Quando você diz que precisa implantar 100 impressoras, você não quer dizer que todos os computadores (1..1000) devem ter todas as 100 impressoras, certo?
Adil Hindistan
1
@AdilHindistan Não. Cada computador deve ter todas as impressoras disponíveis no site. (Mais ou menos.) Mas separá-los não é a parte mais difícil. Está colocando as impressoras em GPOs em primeiro lugar, o que acaba se tornando mais difícil do que você imagina.
HopelessN00b

Respostas:

7

Pesquisei bastante no Google e até brinquei com a backup-GPOesperança de poder hackear o arquivo XML resultante e reimportá-lo, mas suspeito que um script do PowerShell esteja no seu futuro.

Não é tão ruim. Você pode gerar a lista de impressoras a partir do servidor mais próximo, percorrê-las e mapeá-las.

Algo assim:

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

Se as impressoras tiverem nomes lógicos e houver alguma maneira lógica de identificar as máquinas, você poderá refinar mais. Eu costumava escolher o servidor mais próximo com base no acesso ao endereço IP do cliente, por exemplo. Se o endereço IP for 10.20. *, Vá para o servidor1. Etc.

Espero que ajude.

Editar:

Olhando a documentação do @ EvanAnderson, tenho certeza de que o XML é hackável.

Bit relevante do meu arquivo exportado (com redações):

<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
fonte
É uma boa resposta (e posso acabar usando algo assim para cumprir alguns de nossos prazos), mas suspeito que um estagiário ou subordinado esteja no futuro dessa pergunta, na verdade, já que somos obrigados a usar GPOs / GPPs para atribuir impressoras em algum momento. E, embora um script de logon do PS atenda tecnicamente a esse requisito, espero que o gerenciamento se concentre em mim o suficiente para fazer com que não valha a pena fazê-lo dessa maneira.
HopelessN00b
Infelizmente. :( O GPO powershell cmdlets parecem backup, restaurar, criar objetos em branco ... mas não adicionar GPOs Os objetos XML que têm as políticas de impressora olhar. Completamente hackable exceto para o GUID.
Katherine Villyard
1
Sim, sem ferramentas de terceiros, a automação de GPO / GPP via PowerShell é bastante dolorosa. Encontrei algo que parece muito bom , exceto pelo fato de exigir um pacote de software de terceiros que provavelmente não poderemos comprar ... portanto, provavelmente haverá algum script como o seu para editar o XML em sites específicos existentes GPOs ... que eu imagino que vou postar aqui quando terminar.
HopelessN00b
8

O gerenciamento de Powershell da Diretiva de Grupo é péssimo sem produtos (comerciais) de terceiros, na minha opinião.

Acho que você está preso no XML (ou no HTML, se preferir ) nos Objetos de Diretiva de Grupo para fazer o que procura.

Felizmente, o XML não parece tão aterrorizante . O valor de UID por impressora (que eu acredito ser o que @KatherineVillyard está se referindo em seu comentário) é apenas um GUID aleatório gerado para cada impressora referenciada no XML.

Aqui está um exemplo de código do Powershell, modelado descaradamente com o código de 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>
"@

(Eu escrevo um código Powershell realmente muito feio.)

Na verdade, não tentei fazer com que o GPP CSE analisasse esse XML. O XML valida, pelo menos.

Estou começando a pensar em escrever alguma monstruosidade usando Get-GPOe analisando o GUID para chegar ao caminho do sistema de arquivos para o GPO no SYSVOL, mas, como preciso fazer um trabalho real esta noite, acho que vou sair isso como um exercício para o leitor. > sorriso <Deve ser altamente viável, no entanto.

Evan Anderson
fonte
Se for um GUID aleatório, é definitivamente hacker. Acabei de atualizar o meu também. Heh.
Katherine Villyard
Modificar o XML em um backup da Diretiva de Grupo certamente funcionaria, mas também é viável alterá-lo "ao vivo" no SYSVOL (desde que seja corajoso, estúpido ou, como eu, ambos). Como tenho trabalho real para fazer esta noite (e já voltei ao @whwhite para os rankings de representantes neste trimestre novamente), acho que vou economizar carregando essa arma em particular e apontando-a aos pés deles por outra pessoa. > risadinha <
Evan Anderson
Sou corajoso, mas não sou tão corajoso. ;) Gerar arquivo, teste de importá-lo no ambiente de teste, etc.
Katherine Villyard
2
O Powershell realmente precisa de mais opções de GPO. Obter-Link, Set-Link, Nova GPO e Set-GPORegistry não são realmente bom o suficiente ...
Mark Henderson
Os comandos internos do PowerShell às vezes não são suficientes. Nesse caso, eu sugeriria olhar para as soluções do 'The GPO Guy. Ele tem uma empresa: sdmsoftware.com
Adil Hindistan
0

Recentemente, empreendi um projeto semelhante e, depois de analisar o bom e velho método push de GPO versus o GPP mais recente e o script, optei por criar o script completo. Não tenho ideia do que funcionaria melhor para você, mas aqui estão algumas dicas para você:

  • Idealmente, use um cliente com um novo sistema operacional (Windows 8/2012 +) para conectar-se aos servidores de impressão e obter informações da impressora nos servidores de impressão:

    Get-Printer-computer PrintServerName

  • Use os grupos do AD Security para mapear filas de impressão para computadores. Então, digamos que você tenha uma fila de impressão (reunida a partir do comando acima) chamada \ PrintServer1 \ MyColorPrinter123, crie um grupo de segurança como printer.group.PrintServer1.MyColorPrinter123 e adicione os computadores a esse grupo

  • No script de inicialização, tenha a função de verificar a associação ao grupo do computador quando ele estiver chegando e verificar se ele faz parte de algum grupo de impressoras. Se estiver, use os comandos internos printui.exe (ou printui.dll) para mapear a impressora assim

    Expressão de chamada 'rundll32 printui.dll, PrintUIEntry / ga / n "\ PrintServer1 \ MyColorPrinter123" / q'

  • Quando o computador estiver ligado, esse serviço de spooler de impressão enviará a 'conexão de impressão', que é o que os GPOs costumavam fazer, para qualquer usuário que faça login.

Você pode ser muito mais detalhado **, mas em um nível alto é o que é preciso.

** Criei uma GUI que permite que os usuários (técnicos) escolham qualquer servidor de impressão e fornece uma lista de impressoras nesse servidor. Se eles escolherem um, poderão ver todas as propriedades dele. Essa informação vem da Get-Printer que mencionei acima. Se você exportar esses dados como um CSV, poderá reutilizá-los para exibir informações.

** Os técnicos usam essa GUI para enviar uma solicitação para adicionar um computador às impressoras que devem conectar. Este é um 'pedido', porque eles não têm permissões no AD.

** Um script de back-end simples observa a pasta e adiciona o computador ao grupo de impressoras que mencionei acima. Portanto, se você já sabe quem deve obter qual impressora, ótimo, pode fazê-lo facilmente. Adicionar computadores a grupos é uma tarefa simples com os Cmdlets do AD.

** Você também pode agendar um trabalho para verificar os servidores de impressão para ver se há novas filas de impressão e compará-los com os grupos do AD.

Portanto, criar uma solução 'gerenciada' é um pouco complicado, mas é fácil começar com o básico e continuar adicionando para ter um sistema muito flexível e fácil de usar que não envolve GPOs ... apenas um pouco do PowerShell

Adil Hindistan
fonte