Implementación de impresoras a través de GPO / GPP: ¿existe una opción programática?

10

Por razones que están fuera de mi control, me encargaron configurar GPO / GPP para implementar nuestras más de 100 impresoras en nuestros más de 1000 clientes.

La buena noticia es que tenemos más de una docena de sitios y, en su mayor parte, tengo permiso para enviar todas las impresoras en el sitio X a todas las PC clientes en el sitio X.

La mala noticia es que las dos formas en que sé cómo hacerlo ( "Implementar con la Política de grupo ...", desde el servidor de impresión " y usando las Preferencias de GPP / Política de grupo ) implican mucho más trabajo manual del que estoy dispuesto a hacer. tantas impresoras. Parece que ni siquiera puedo seleccionar todas las impresoras en un servidor de impresión y usar la Deploy with Group Policy...opción, por ejemplo: espera que lo haga una por una, lo que no va a suceder. Los GPP son aún peores , ya que espera que seleccione la ruta de una impresora desde el servidor de impresión y luego ingrese manualmente un montón de información (como la IP de la impresora) que debería poder obtener de la conexión de la impresora.

Mi Google-Fu para un script para agregar todas las impresoras en un servidor de impresión a un GPO / GPP apareció vacío, y parece que no puedo ver otra forma de hacerlo, incluso de una manera semiautomatizada, pero me estoy quedando con la creencia de que me falta algo, porque no hay forma de que una persona sensata elija agregar manualmente cientos de impresoras a los GPO.

Idealmente, me gustaría encontrar una forma programática para usar los GPP, pero dadas las circunstancias, cualquier solución que no implique docenas de horas agregando impresoras manualmente sería simplemente genial.

¿Alguien tiene una manera de hacer esto, o voy a necesitar construir un script de PowerShell y / o engañar a un subordinado para que haga esto?

HopelessN00b
fuente
1
Como te mencioné en el chat de hoy, hay una interfaz COM para crear y vincular GPO mediante programación ... todo comenzando con algo así $GPM = New-Object -ComObject GPMgmt.Gpm. Creo que esa interfaz, si bien es un cerdo absoluto con el que trabajar, podría proporcionarle un método un poco más compatible que simplemente piratear algún XML que se ve y huele como un GPO real. Sin embargo, a nadie le gusta COM. Menos de todos nosotros Powershellers.
Ryan Ries
1
@RyanRies Sí, todavía estoy dando vueltas en mi mente, y una de las cosas que no he decidido es si mi scrip debe ser compatible o no, o solo una cosa única para configurarlo en el primer lugar. Estoy seguro de que lo publicaré aquí, lo que sea que termine haciendo.
HopelessN00b
Cuando dice que necesita implementar 100 impresoras, no quiere decir que todas las computadoras (1..1000) deben tener las 100 impresoras, ¿verdad?
Adil Hindistan
1
@AdilHindistan No. Cada computadora debe tener todas las impresoras disponibles en su sitio. (Más o menos). Pero separarlos no es la parte difícil. En primer lugar, está haciendo que las impresoras se conviertan en GPO, lo que resulta ser más doloroso de lo que crees que debería ser.
HopelessN00b

Respuestas:

7

Busqué en Google bastante duro e incluso jugué con la backup-GPOesperanza de poder piratear el archivo XML resultante y volver a importarlo, pero sospecho que hay un script de PowerShell en su futuro.

No está tan mal. Puede generar la lista de impresoras desde el servidor más cercano y luego recorrerla y asignarla.

Algo como esto:

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

Si las impresoras se llaman cosas lógicas, y hay alguna forma lógica de identificar las máquinas, es posible que pueda refinarlas más. Solía ​​elegir el servidor más cercano basándome en la dirección IP del cliente, por ejemplo. Si la dirección IP es como 10.20. *, Vaya al servidor1. Etc.

Espero que eso ayude.

Editar:

Mirando la documentación de @ EvanAnderson, estoy bastante seguro de que XML es pirateable.

Pedazo relevante de mi archivo exportado (con redacciones):

<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
fuente
Es una buena respuesta (y podría terminar usando algo como esto para cumplir con algunos de nuestros plazos), pero sospecho que un interno o subordinado está en el futuro de esta pregunta, en realidad, ya que estamos obligados a usar GPO / GPP para asignar impresoras en algún momento. Y aunque una secuencia de comandos de inicio de sesión de PS técnicamente se ajusta a ese requisito, espero que la administración se aproveche de mí lo suficiente como para que no valga la pena hacerlo de esa manera.
HopelessN00b
Pobre de mí. :( Los cmdlets GPO PowerShell parecen hacer copias de seguridad, restaurar, crear objetos en blanco ... pero no agregarlos a los GPO. Los objetos XML que tienen las políticas de la impresora parecen completamente pirateables, excepto el GUID.
Katherine Villyard
1
Sí, sin herramientas de terceros, la automatización de GPO / GPP a través de PowerShell es bastante dolorosa. Encontré algo que se ve bastante bien , excepto por el hecho de que requiere un paquete de software de terceros que probablemente no se nos permitirá comprar ... por lo que probablemente sea un script como el suyo para editar el XML en el sitio específico existente GPO ... que imagino que publicaré aquí una vez que termine.
HopelessN00b
8

En mi opinión, la administración de Powershell de la Política de grupo apesta sin productos de terceros (comerciales).

Creo que está atrapado en el XML (o en HTML si lo prefiere ) en Objetos de directiva de grupo para hacer lo que está buscando.

Afortunadamente, el XML no se ve tan aterrador . El valor de UID por impresora (que creo que es a lo que @KatherineVillyard se refiere en su comentario) es solo un GUID aleatorio generado para cada impresora referenciada en el XML.

Aquí hay un ejemplo de código Powershell, modelado descaradamente a partir del 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>
"@

(Escribo código Powershell realmente muy feo).

En realidad, no he intentado que el GPP CSE analice este XML. El XML valida, al menos.

Estoy empezando a pensar en escribir cierta monstruosidad usando Get-GPOy analizando el GUID para llegar a la ruta del sistema de archivos para el GPO en el SYSVOL pero, dado que necesito hacer un trabajo real esta noche, creo que me iré eso como ejercicio para el lector. > sonrisa <Sin embargo, debería ser muy factible.

Evan Anderson
fuente
Si es un GUID aleatorio, definitivamente es pirateable. Acabo de actualizar el mío también. Je
Katherine Villyard
Modificar el XML en una copia de seguridad de la directiva de grupo ciertamente funcionaría, pero cambiarlo "en vivo" en el SYSVOL también debería ser factible (siempre que uno sea valiente, estúpido o, como yo, ambos). Dado que tengo mucho trabajo que hacer esta noche (y desde que volví a @ewwhite para la clasificación de representantes este trimestre nuevamente) creo que ahorraré cargar esa arma en particular y apuntarla a sus pies para otra persona. > risita <
Evan Anderson
Soy valiente, pero no soy tan valiente. ;) Generar archivo, probar importarlo en un entorno de prueba, etc.
Katherine Villyard
2
Powershell realmente necesita más opciones de GPO. Get-Link, Set-Link, New-GPO y Set-GPORegistry no son lo suficientemente buenos ...
Mark Henderson
Los comandos integrados de PowerShell a veces no son suficientes. En ese caso, sugeriría mirar las soluciones de 'The GPO Guy. Él tiene una compañía: sdmsoftware.com
Adil Hindistan
0

Recientemente emprendí un proyecto similar y después de buscar un buen método de inserción de GPO vs. GPP más nuevo vs. scripting, elegí por scripting todo. No tengo idea de qué funcionaría mejor para usted, pero aquí hay un par de punteros para usted:

  • Lo ideal es usar un cliente con un nuevo sistema operativo (Windows 8/2012 +) para conectarse a los servidores de impresión y obtener información de la impresora de los servidores de impresión:

    Get-Printer -computer PrintServerName

  • Use los grupos de seguridad de AD para asignar colas de impresión a las computadoras. Entonces, supongamos que tiene una cola de impresión (que reunió del comando anterior) llamada \ PrintServer1 \ MyColorPrinter123, cree un grupo de seguridad como printer.group.PrintServer1.MyColorPrinter123 y agregue las computadoras a ese grupo

  • En la secuencia de comandos de inicio, tenga una función para verificar la pertenencia a grupos de la computadora cuando se presente, y ver si es parte de algún grupo de impresoras. Si es así, use los comandos integrados printui.exe (o printui.dll) para asignar la impresora de esta manera

    Invocar-Expresión 'rundll32 printui.dll, PrintUIEntry / ga / n "\ PrintServer1 \ MyColorPrinter123" / q'

  • Una vez que la computadora está encendida, ese servicio de cola de impresión empujará la 'conexión de impresión', que es lo que solían hacer los GPO, a cualquier usuario que vaya a iniciar sesión.

Puede ir mucho más detallado ** pero a un alto nivel eso es lo que se necesita.

** Creé una GUI que permite a los usuarios (técnicos realmente) elegir cualquier servidor de impresión, y les da una lista de impresoras en ese servidor. Si eligen uno, pueden ver todas las propiedades del mismo. Esa información proviene de Get-Printer que mencioné anteriormente. Si exporta esos datos como un csv, podría reutilizarlos para mostrar información.

** Los técnicos usan esa GUI para enviar una solicitud para agregar una computadora a las impresoras que se supone que deben conectarse. Esta es una 'solicitud', b / c no tienen permisos en AD.

** Un simple script de back-end observa la carpeta y agrega la computadora al grupo de impresoras que mencioné anteriormente. Por lo tanto, si ya sabe quién debe obtener qué impresora, excelente, puede hacerlo fácilmente. Agregar computadoras a grupos es un trabajo simple con Cmdlets AD.

** También puede programar un trabajo para verificar los servidores de impresión para ver si hay nuevas colas de impresión y compararlas con sus grupos de AD.

Por lo tanto, crear una solución 'administrada' es un poco complicado, pero es fácil comenzar con lo básico y seguir agregando para tener un sistema muy flexible y fácil de usar que no involucre GPO ... solo un poco de PowerShell

Adil Hindistan
fuente