Pour plusieurs raisons, principalement liées à la sécurité, les scripts PowerShell ne sont pas aussi facilement portables et utilisables que les scripts batch. Cependant, nous pouvons regrouper un script batch avec nos scripts PowerShell pour contourner ces problèmes. Ici, nous allons vous montrer quelques uns de ces problèmes, et comment créer un script batch pour les contourner.
À moins que le système cible n'ait été préconfiguré pour permettre l'exécution de scripts arbitraires, avec les privilèges requis et en utilisant les bons paramètres, il est probable que vous rencontriez des problèmes lorsque vous essayerez de le faire.
Commençons par aborder le premier problème - associations de fichiers .PS1. Vous ne pouvez pas double-cliquer pour exécuter des fichiers .PS1, mais vous pouvez exécuter un fichier .BAT de cette façon. Nous allons donc écrire un fichier batch pour appeler le script PowerShell depuis la ligne de commande pour nous.
Nous n'avons donc pas besoin de réécrire le fichier batch pour chaque script, ou chaque fois que nous déplaçons un script, il va utiliser une variable auto-référençant pour construire le chemin du fichier pour le script PowerShell. Pour que cela fonctionne, le fichier batch doit être placé dans le même dossier que votre script PowerShell et avoir le même nom de fichier. Donc, si votre script PowerShell s'appelle "MyScript.ps1", vous devrez nommer votre fichier batch "MyScript.bat" et vous assurer qu'il se trouve dans le même dossier. Ensuite, placez ces lignes dans le script batch:
@ECHO OFF PowerShell.exe -Command "& '% ~ dpn0.ps1'" PAUSE
S'il n'y avait pas les autres restrictions de sécurité en place, cela vraiment tout ce qu'il faut pour exécuter un script PowerShell à partir d'un fichier batch. En fait, la première et la dernière lignes sont principalement une question de préférence - c'est la deuxième ligne qui fait vraiment le travail. Voici la répartition:
@ECHO OFF désactive la commande en écho. Cela empêche que vos autres commandes n'apparaissent à l'écran lors de l'exécution du fichier batch. Cette ligne est elle-même masquée par l'utilisation du symbole at (@) devant elle.
PowerShell.exe -Command "& '% ~ dpn0.ps1'" exécute réellement le script PowerShell. PowerShell.exe peut bien sûr être appelé à partir de n'importe quelle fenêtre ou fichier batch CMD pour lancer PowerShell sur une console vide comme d'habitude. Vous pouvez également l'utiliser pour exécuter des commandes directement à partir d'un fichier batch, en incluant le paramètre -Command et les arguments appropriés. La façon dont ceci est utilisé pour cibler notre fichier .PS1 est avec la variable spéciale% ~ dpn0. Exécuté à partir d'un fichier de commandes,% ~ dpn0 évalue la lettre de lecteur, le chemin du dossier et le nom de fichier (sans extension) du fichier de traitement par lots. Étant donné que le fichier de commandes et le script PowerShell seront dans le même dossier et portent le même nom,% ~ dpn0.ps1 se traduira par le chemin complet du script PowerShell.
PAUSE interrompt simplement l'exécution du lot et attend la saisie de l'utilisateur. Il est généralement utile d'avoir à la fin de vos fichiers de traitement par lot, de sorte que vous ayez la possibilité d'examiner toute sortie de commande avant que la fenêtre ne disparaisse. Au fur et à mesure que nous testons chaque étape, l'utilité devient plus évidente.
Le fichier batch de base est donc configuré. À des fins de démonstration, ce fichier est enregistré sous "D: Script Lab MyScript.bat" et il y a un "MyScript.ps1" dans le même dossier. Voyons voir ce qui se passe quand on double-clique sur MyScript.bat.
Évidemment, le script PowerShell ne s'est pas exécuté, mais c'est à prévoir - nous avons seulement abordé le premier de nos quatre problèmes, après tout. Cependant, il y a quelques bits importants démontrés ici:
Le profil, dans ce cas, est un simple script d'une ligne utilisé pour cette démonstration afin de générer une sortie à chaque fois que le profil est actif. Vous pouvez également personnaliser votre propre profil PowerShell pour ce faire, si vous souhaitez tester ces scripts vous-même. Ajoutez simplement la ligne suivante à votre script de profil:
Write-Output 'Profil PowerShell personnalisé en vigueur!'
La méthode ExecutionPolicy du système de test est définie sur RemoteSigned. Cela permet l'exécution de scripts créés localement (comme le script de profil), tout en bloquant les scripts provenant de sources externes, sauf s'ils sont signés par une autorité de confiance. À des fins de démonstration, la commande suivante a été utilisée pour marquer MyScript.ps1 comme provenant d'une source externe:
Add-Content -Path 'D: Script Lab MyScript.ps1' -Value "[ZoneTransfer] 'nZoneId = 3 "-Stream" Zone.Identifier '
Cela définit le flux de données alternatif Zone.Identifier sur MyScript.ps1 afin que Windows pense que le fichier provient d'Internet. Il peut être facilement annulé avec la commande suivante:
Clear-Content -Path 'D: Script Lab MyScript.ps1' -Stream 'Zone.Identifier'
Obtenir autour du paramètre ExecutionPolicy, à partir de CMD ou d'un script batch, est en fait assez facile. Nous modifions simplement la deuxième ligne du script pour ajouter un paramètre supplémentaire à la commande PowerShell.exe
PowerShell.exe -ExecutionPolicy Bypass -Command "& '% ~ dpn0.ps1'"
Le paramètre -ExecutionPolicy peut être utilisé pour modifier la stratégie d'exécution utilisée lorsque vous générez une nouvelle session PowerShell. Cela ne persistera pas au-delà de cette session, de sorte que nous pouvons exécuter PowerShell comme ça chaque fois que nous en avons besoin sans affaiblir la posture de sécurité générale du système. Maintenant que nous avons corrigé cela, essayons d'en faire un autre:
Maintenant que le script a été correctement exécuté, nous pouvons voir ce qu'il fait réellement. Cela nous permet de savoir que nous exécutons le script en tant qu'utilisateur limité. Le script est en fait exécuté par un compte avec des autorisations d'administrateur, mais le contrôle de compte d'utilisateur devient gênant. Bien que les détails sur la façon dont le script recherche l'accès administrateur dépassent la portée de cet article, voici le code utilisé pour la démonstration:
if (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ()). IsInRole ([Security.Principal.WindowsBuiltInRole] "Administrateur")) {Write-Output 'Exécution en tant qu'administrateur!'} Else {Write-Output 'Running Limited!'} Pause
Vous remarquerez également qu'il y a maintenant deux opérations "Pause" dans la sortie du script - une du script PowerShell et une du fichier batch. La raison pour cela sera plus évidente à l'étape suivante.
Si votre script n'exécute aucune commande nécessitant une élévation, et que vous êtes sûr que vous ne l'aurez pas Pour vous inquiéter des profils personnalisés d'un utilisateur, vous pouvez ignorer le reste. Si vous exécutez des cmdlets de niveau Administrateur, vous aurez besoin de cette pièce.
Malheureusement, il n'existe aucun moyen de déclencher le contrôle de compte d'utilisateur pour l'élévation à partir d'un fichier de traitement par lots ou d'une session CMD. Cependant, PowerShell nous permet de le faire avec Start-Process. Lorsqu'il est utilisé avec "-Verb RunAs" dans ses arguments, Start-Process essayera de lancer une application avec des permissions d'administrateur. Si la session PowerShell n'est pas déjà élevée, une invite UAC est déclenchée. Pour l'utiliser à partir du fichier batch pour lancer notre script, nous allons générer deux processus PowerShell: l'un pour lancer Start-Process et l'autre, lancé par Start-Process, pour exécuter le script. La deuxième ligne du fichier de commandes doit être remplacée par ceci:
PowerShell.exe -Command "& {Démarrer-Process PowerShell.exe -ArgumentList '-ExecutionPolicy Contourner -File" "% ~ dpn0.ps1" "' - Verb RunAs} "
Lorsque le fichier batch est exécuté, la première ligne de sortie que nous verrons provient du script de profil PowerShell. Ensuite, il y aura une invite UAC lorsque Start-Process essayera de lancer MyScript.ps1.
Après avoir cliqué sur l'invite UAC, une nouvelle instance de PowerShell apparaît. Comme il s'agit d'une nouvelle instance, nous verrons à nouveau l'avis de script de profil. Ensuite, MyScript.ps1 s'exécute et nous voyons que nous sommes en effet dans une session élevée.
Et il y a la raison pour laquelle nous avons aussi deux pauses ici. Si ce n'est pas le cas dans le script PowerShell, nous ne verrons jamais la sortie du script - la fenêtre PowerShell apparaîtra et disparaîtra dès que le script sera exécuté. Et sans la pause dans le fichier batch, nous ne serions pas en mesure de voir s'il y a eu des erreurs de lancement de PowerShell en premier lieu.
Débarrassons-nous de cette méchante avis de profil personnalisé maintenant, devons-nous? Ici, ce n'est même pas une nuisance, mais si le profil PowerShell d'un utilisateur modifie les paramètres, les variables ou les fonctions par défaut d'une manière que vous n'avez peut-être pas prévue avec votre script, ils peuvent être très gênants. Il est beaucoup plus simple d'exécuter votre script sans le profil, donc vous n'avez pas à vous en préoccuper. Pour ce faire, nous avons juste besoin de changer une seconde fois la deuxième ligne du fichier batch:
PowerShell.exe -NoProfile -Command "& {Démarrer-traiter PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "'-Verb RunAs}"
L'ajout du paramètre -NoProfile aux deux instances de PowerShell lancées par le script signifie que le script de profil de l'utilisateur sera complètement ignoré dans les deux étapes et dans notre script PowerShell fonctionnera dans un environnement par défaut assez prévisible. Ici, vous pouvez voir qu'il n'y a aucun avis de profil personnalisé dans l'un des shells générés
Si vous n'avez pas besoin de droits d'administrateur dans votre script PowerShell et que vous avez ignoré l'étape 3, vous pouvez vous passer de la seconde instance PowerShell la deuxième ligne de votre fichier batch doit ressembler à ceci:
PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "& '% ~ dpn0.ps1'"
La sortie ressemblera à ceci:
( Bien sûr, pour les scripts non-administrateur, vous pouvez également vous passer d'une pause de fin de script dans votre script PowerShell, puisque tout est capturé dans la même fenêtre de console et sera retenu par la pause à la fin du script.
Selon que vous ayez ou non besoin d'autorisations d'administrateur pour votre script PowerShell (et que vous ne devriez pas les demander si ce n'est pas le cas), le dernier fichier de commandes devrait ressembler comme l'un des deux ci-dessous.
Sans accès administrateur:
@ECHO OFF PowerShell.exe -NoProfile -ExecutionPoli cy Bypass -Command "& '% ~ dpn0.ps1'" PAUSE
Avec un accès administrateur:
@ECHO OFF PowerShell.exe -NoProfile -Command "& {Démarrer-traiter PowerShell.exe -ArgumentList '-NoProfile - ExecutionPolicy Bypass -File "% ~ dpn0.ps1 " '-Verb RunAs} "PAUSE
N'oubliez pas de placer le fichier séquentiel dans le même dossier que le script PowerShell pour lequel vous voulez l'utiliser, et donnez-lui le même nom . Ensuite, quel que soit le système sur lequel vous utiliserez ces fichiers, vous serez en mesure d'exécuter votre script PowerShell sans avoir à manipuler les paramètres de sécurité du système. Vous pouvez certainement effectuer ces modifications manuellement à chaque fois, mais cela vous évite ce problème et vous n'aurez plus à vous soucier de revenir sur ces modifications plus tard.
Références:
Les meilleurs utilitaires pour personnaliser Windows 10
En soi, Windows 10 n'a pas l'air si mal. Il y a une interface moderne où tout est principalement plat et coloré. Le menu Démarrer est un mélange de Windows 7 et Windows 8. La barre des tâches est simple et directe. Le bureau se compose de vos icônes et d'un fond d'écran.Pour la plupart des gens, les paramètres par défaut sont très bien, d'autant plus que vous pouvez changer le fond d'écran et personnaliser les couleurs du menu Démarrer et de la barre des tâches. Cependant,
Comment s'inscrire aux horaires de vos équipes sportives préférées dans Google Agenda
Si vous êtes comme moi, vous planifiez votre vie autour de vos équipes sportives préférées (Go Bulls!). Bien que j'essaie généralement de me souvenir des soirées passées par mon équipe, ce n'est parfois pas possible - surtout dans une ligue comme la NBA où il y a 82 matchs de saison régulière. Heureusement, il existe un moyen super simple d'ajouter les horaires de vos équipes préférées à Google Agenda, de sorte que vous ne manquiez jamais un jeu.