Déploiement d'imprimantes via GPO / GPP - existe-t-il une option programmatique?

10

Pour des raisons indépendantes de ma volonté, j'ai été chargé de configurer des GPO / GPP pour déployer nos 100+ imprimantes sur nos 1000+ clients.

La bonne nouvelle est que nous avons plus d'une douzaine de sites, et pour la plupart, je suis autorisé à déplacer toutes les imprimantes du site X vers tous les PC clients du site X.

La mauvaise nouvelle est que les deux façons dont je sais le faire ( "Déployer avec la stratégie de groupe ...", à partir du serveur d'impression " et utiliser les préférences de stratégie de groupe / GPP ) impliquent beaucoup plus de travail manuel que je ne le souhaite. autant d'imprimantes. Je n'arrive même pas à sélectionner toutes les imprimantes sur un serveur d'impression et à utiliser l' Deploy with Group Policy...option, par exemple - il s'attend à ce que je le fasse une par une, ce qui ne va pas se produire. Les GPP sont encore pires , car il s'attend à ce que je sélectionne le chemin d'une imprimante à partir du serveur d'impression, puis que je saisisse manuellement un tas d'informations (telles que l'adresse IP de l'imprimante) qu'il devrait pouvoir obtenir à partir de la connexion de l'imprimante.

Mon Google-Fu pour un script pour ajouter toutes les imprimantes sur un serveur d'impression à un GPO / GPP est apparu vide, et je n'arrive pas à voir une autre façon de le faire, même de manière semi-automatisée, mais je m'en tiens avec la conviction que je manque quelque chose, car il n'y a aucun moyen qu'une personne sensée choisisse d'ajouter manuellement des centaines d'imprimantes dans les GPO.

Idéalement, je voudrais trouver un moyen programmatique d'utiliser les GPP, mais dans les circonstances, toute solution qui n'implique pas des dizaines d'heures d'ajout manuel d'imprimantes serait tout simplement géniale.

Quelqu'un a-t-il un moyen de le faire, ou vais-je avoir besoin de créer un script PowerShell et / ou d'inciter un subordonné à le faire?

HopelessN00b
la source
1
Comme je vous l'ai mentionné dans le chat plus tôt aujourd'hui, il existe une interface COM pour créer et lier par programme des objets de stratégie de groupe ... commençant tous par quelque chose comme $GPM = New-Object -ComObject GPMgmt.Gpm. Je pense que cette interface, tout en étant un cochon absolu avec lequel travailler, pourrait vous fournir une méthode légèrement plus supportable que de simplement pirater du XML qui ressemble à un vrai GPO. Mais personne n'aime COM. Le moins que nous, Powershellers.
Ryan Ries
1
@RyanRies Oui, je suis encore en train de me lancer dans la tête, et l'une des choses que je n'ai pas décidé est de savoir si mon script doit être supportable, ou juste une chose ponctuelle pour le configurer dans le première place. Je suis sûr que je le posterai ici, quoi que je fasse.
HopelessN00b
Quand vous dites que vous devez déployer 100 imprimantes, vous ne voulez pas dire que tous les ordinateurs (1..1000) devraient avoir les 100 imprimantes, non?
Adil Hindistan
1
@AdilHindistan Non. Chaque ordinateur doit disposer de toutes les imprimantes disponibles sur son site. (Plus ou moins.) Mais les séparer n'est pas la partie difficile. Il s'agit de faire en sorte que les imprimantes deviennent des objets de stratégie de groupe, ce qui s'avère plus difficile que vous ne le pensez.
HopelessN00b

Réponses:

7

J'ai googlé assez fort, et même joué avec backup-GPOdans l'espoir de pouvoir pirater le fichier XML résultant et le réimporter, mais je soupçonne qu'un script PowerShell est dans votre avenir.

C'est pas si mal. Vous pouvez générer la liste des imprimantes à partir du serveur le plus proche, puis la parcourir et les mapper.

Quelque chose comme ça:

$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 les imprimantes sont nommées choses logiques et qu'il existe un moyen logique d'identifier les machines, vous pourrez peut-être les affiner davantage. J'ai utilisé pour choisir le serveur le plus proche en fonction de l'extraction de l'adresse IP du client, par exemple. Si l'adresse IP est 10.20. *, Accédez à server1. Etc.

J'espère que ça aide.

Éditer:

En regardant la documentation de @ EvanAnderson, je suis presque sûr que XML est piratable.

Bit pertinent de mon fichier exporté (avec expurgations):

<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
la source
C'est une bonne réponse (et je pourrais finir par utiliser quelque chose comme ça pour respecter certains de nos délais), mais je soupçonne qu'un stagiaire ou un subordonné est dans l'avenir de cette question, en fait, car nous sommes tenus d'utiliser des GPO / GPP pour attribuer imprimantes à un moment donné. Et même si un script de connexion PS répondrait techniquement à cette exigence, je m'attends à ce que la direction me cherche suffisamment pour que cela ne vaille pas la peine de le faire de cette façon.
HopelessN00b
Hélas. :( Les ​​applets de commande PowerShell du GPO semblent sauvegarder, restaurer, créer des objets vierges ... mais pas s'ajouter aux GPO. Les objets XML qui ont les politiques d'imprimante semblent complètement piratables à l'exception du GUID.
Katherine Villyard
1
Oui, sans outils tiers, l'automatisation GPO / GPP via PowerShell est assez douloureuse. J'ai trouvé quelque chose qui semble assez bon , sauf pour le fait qu'il nécessite une suite logicielle tierce que nous ne serons probablement pas autorisés à acheter ... il s'agira donc probablement d'un script comme le vôtre pour modifier le XML dans un site spécifique existant GPO ... que j'imagine que je publierai ici une fois que j'aurai terminé.
HopelessN00b
8

À mon avis, la gestion Powershell de la stratégie de groupe est nulle sans produits tiers (commerciaux).

Je pense que vous êtes coincé dans le XML (ou en HTML si vous préférez ) dans les objets de stratégie de groupe pour faire ce que vous recherchez.

Heureusement, le XML n'a pas l'air si terrifiant . La valeur UID par imprimante (à laquelle je crois que @KatherineVillyard fait référence dans son commentaire) n'est qu'un GUID aléatoire généré pour chaque imprimante référencée dans le XML.

Voici un exemple de code Powershell, modélisé sans vergogne sur le code 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>
"@

(J'écris du code Powershell vraiment, vraiment moche.)

Je n'ai pas réellement essayé de faire analyser le XML par le GPP CSE. Le XML valide au moins.

Je commence à penser à écrire de la monstruosité en utilisant Get-GPOet en analysant le GUID pour accéder au chemin du système de fichiers pour le GPO dans le SYSVOL mais, étant donné que j'ai besoin de faire un vrai travail ce soir, je pense que je vais partir cela comme un exercice pour le lecteur. > sourire <Cela devrait être hautement réalisable, cependant.

Evan Anderson
la source
S'il s'agit d'un GUID aléatoire, il est définitivement piratable. Je viens aussi de mettre à jour le mien. Il h.
Katherine Villyard
Modifier le XML dans une sauvegarde de stratégie de groupe fonctionnerait certainement, mais le changer "en direct" dans le SYSVOL devrait également être réalisable (à condition que l'un soit courageux, stupide ou, comme moi, les deux). Étant donné que j'ai un vrai travail à faire ce soir (et puisque je suis de retour sur @ewwhite pour le classement des représentants ce trimestre encore), je pense que je vais économiser en chargeant cette arme particulière et en la pointant à leurs pieds pour quelqu'un d'autre. > gloussements <
Evan Anderson
Je suis courageux, mais je ne suis pas si courageux. ;) Générer un fichier, tester l'importer dans un environnement de test, etc.
Katherine Villyard
2
Powershell a vraiment besoin de plus d'options GPO. Get-Link, Set-Link, New-GPO et Set-GPORegistry ne sont pas vraiment assez bons ...
Mark Henderson
Les commandes PowerShell intégrées ne sont parfois pas suffisantes. Dans ce cas, je suggère de regarder «Les solutions du GPO Guy. Il a une entreprise: sdmsoftware.com
Adil Hindistan
0

J'ai récemment entrepris un projet similaire et après avoir étudié la bonne méthode de poussée des GPO par rapport aux nouveaux GPP et aux scripts, j'ai choisi de créer des scripts pour le tout. Je n'ai aucune idée de ce qui fonctionnerait le mieux pour vous, mais voici quelques pointeurs pour vous:

  • Utilisez idéalement un client avec un nouveau système d'exploitation (Windows 8/2012 +) pour vous connecter aux serveurs d'impression et obtenir des informations sur l'imprimante à partir des serveurs d'impression:

    Get-Printer -computer PrintServerName

  • Utilisez les groupes de sécurité AD pour mapper les files d'attente d'impression aux ordinateurs. Supposons donc que vous ayez une file d'attente d'impression (que vous avez collectée à partir de la commande ci-dessus) nommée \ PrintServer1 \ MyColorPrinter123, créez un groupe de sécurité comme printer.group.PrintServer1.MyColorPrinter123 et ajoutez les ordinateurs à ce groupe

  • Dans le script de démarrage, disposez d'une fonction pour vérifier l'appartenance au groupe de l'ordinateur lors de son démarrage et voir s'il fait partie d'un groupe d'imprimantes. Si tel est le cas, utilisez les commandes intégrées printui.exe (ou printui.dll) pour mapper l'imprimante comme ceci

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

  • Une fois que l'ordinateur est en marche, ce service de spouleur d'impression poussera la «connexion d'impression», ce que les GPO faisaient autrefois, vers tout utilisateur qui se connectera.

Vous pouvez aller beaucoup plus en détail ** mais à un niveau élevé c'est ce qu'il faut.

** J'ai créé une interface graphique qui permet aux utilisateurs (vraiment aux techniciens) de choisir n'importe quel serveur d'impression et leur donne la liste des imprimantes sur ce serveur. S'ils en choisissent un, ils peuvent en voir toutes les propriétés. Ces informations proviennent de Get-Printer que j'ai mentionné ci-dessus. Si vous exportez ces données au format csv, vous pouvez ensuite les réutiliser pour afficher des informations.

** Les techniciens utilisent cette interface graphique pour envoyer une demande d'ajout d'un ordinateur aux imprimantes qu'il est censé connecter. Il s'agit d'une «demande», car ils n'ont pas d'autorisations dans AD.

** Un simple script backend surveille le dossier et ajoute l'ordinateur au groupe d'imprimantes que j'ai mentionné ci-dessus. Donc, si vous savez déjà qui devrait obtenir quelle imprimante, tant mieux, vous pouvez facilement le faire. L'ajout d'ordinateurs à des groupes est une tâche simple avec les applets de commande AD.

** Vous pouvez également planifier un travail pour vérifier les serveurs d'impression pour voir s'il y a de nouvelles files d'attente d'impression et les comparer à vos groupes AD.

Donc, créer une solution «gérée» est un peu compliqué, mais il est facile de commencer par les bases et de continuer à ajouter pour avoir un système très flexible et facile à utiliser qui n'implique pas de GPO ... juste un peu PowerShell

Adil Hindistan
la source