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

10

Por motivos fora do meu controle, tenho a tarefa de configurar GPO / GPPs para implantar nossas mais de 100 impressoras em nossos mais de 1.000 clientes.

A boa notícia é que temos mais de uma dúzia de sites e, na maioria das vezes, posso usar todas as impressoras no site X para todos os PCs clientes no site X.

A má notícia é que as duas maneiras que eu sei como fazer isso (" Implantar com Diretiva de Grupo ... ", do servidor de impressão" e usando o GPP / Grupo As Preferências de Política envolvem muito mais trabalho manual do que estou disposto a fazer para muitas impressoras.Eu nem consigo selecionar todas as impressoras em um servidor de impressão e usar a opção Deploy with Group Policy... , por exemplo - espera que eu faça isso um por um, o que não vai acontecer.Os GPPs são ainda piores, pois espera que eu selecione o caminho de uma impressora a partir do servidor de impressão e insira manualmente um monte de informações (como IP da impressora). ) que deve ser capaz de 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 surgiu vazio, e eu não consigo ver outra maneira de fazer isso de uma forma semi-automatizada, mas eu Estou ficando com a crença de que estou perdendo alguma coisa, porque não há como qualquer pessoa sensata escolher adicionar manualmente centenas de impressoras nos GPOs.

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

Alguém tem uma maneira de fazer isso, ou eu precisarei criar um script do PowerShell e / ou enganar um subordinado para fazer isso?

    
por HopelessN00b 17.02.2014 / 17:46

3 respostas

7

Eu pesquisei bastante e até mesmo brinquei com backup-GPO na esperanç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 assim. Você pode gerar a lista de impressoras a partir do servidor mais próximo e, em seguida, percorrê-las e mapeá-las.

Algo parecido com isto:

$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 forem chamadas de coisas lógicas e houver alguma maneira lógica de identificar as máquinas, você poderá refinar mais. Eu costumava escolher o servidor mais próximo baseado em puxar o endereço IP do cliente, por exemplo. Se o endereço IP for 10.20. *, Vá para server1. Etc.

Espero que ajude.

Editar:

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

Parte 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>
    
por 18.02.2014 / 00:24
8

A administração da Política de Grupo da Powershell suga sem produtos de terceiros (comerciais), em minha opinião.

Acho que você está preso navegando pelo XML (ou no HTML, se preferir ) no grupo Objetos de Política para fazer o que você está procurando.

Felizmente, o XML não parece tão aterrorizante . O valor 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.

Veja um exemplo do código Powershell, modelado descaradamente a partir do 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 código Powershell realmente feio.)

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

Estou começando a pensar em escrever alguma monstruosidade usando Get-GPO e analisando o GUID para obter o caminho do sistema de arquivos para o GPO no SYSVOL, mas, considerando que preciso fazer algum trabalho real essa noite, acho Vou deixar isso como um exercício para o leitor. > sorrir < Deve ser altamente viável, no entanto.

    
por 18.02.2014 / 00:43
0

Recentemente, realizei um projeto semelhante e depois de analisar o método de envio de um bom GPO versus o GPP mais novo versus o script, optei por criar o script da coisa toda. Não tenho ideia do que funcionaria melhor para você, mas aqui estão algumas dicas para você:

  • O ideal é usar um cliente com um novo sistema operacional (Windows 8/2012 +) para conectar-se a servidores de impressão e obter informações da impressora a partir de servidores de impressão:

    Get-Printer -computer PrintServerName

  • Use grupos de segurança do AD para mapear filas de impressão para computadores. Então, digamos que você tenha uma fila de impressão (obtida 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 uma função para verificar a associação ao grupo do computador quando ele estiver chegando e ver se ele faz parte de qualquer grupo de impressoras. Se estiver, use os comandos incorporados printui.exe (ou printui.dll) para mapear a impressora assim

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

  • Quando o computador estiver ativo, o serviço de spooler de impressão enviará a 'conexão de impressão', que é o que os GPOs faziam, para qualquer usuário que fizer login.

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

** Eu criei uma GUI que permite que os usuários (técnicos realmente) escolham qualquer servidor de impressão, e isso lhes dá uma lista de impressoras naquele servidor. Se eles escolherem um, eles poderão ver todas as propriedades dele. Essa informação vem do 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 ser conectadas. Este é um 'pedido', b / c eles não têm permissões no AD.

** Um simples script de back-end observa a pasta e adiciona o computador ao grupo de impressoras que mencionei acima. Então, se você já sabe quem deve pegar qual impressora, ótimo, você pode facilmente fazer isso. Adicionar computadores a grupos é um trabalho 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 a seus grupos do AD.

Então, criar uma solução 'gerenciada' está um pouco envolvida, 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 envolva GPOs ... um pouco PowerShell

    
por 18.02.2014 / 04:48