J'essaie d'écrire un fichier batch pour que mes utilisateurs s'exécutent à partir de leurs machines Vista avec UAC. Le fichier réécrit son fichier d'hôtes, il doit donc être exécuté avec les autorisations d'administrateur. Je dois pouvoir leur envoyer un e-mail avec un lien vers le fichier .bat. Le comportement souhaité est que lorsqu'ils cliquent avec le bouton droit sur le fichier et disent Ouvrir, ils obtiennent l'une de ces boîtes de dialogue UAC qui assombrissent l'écran et les obligent à répondre s'ils veulent donner à l'application l'autorisation de s'exécuter en tant qu'administrateur. Au lieu de cela, ils voient simplement "Accès refusé" dans la fenêtre de ligne de commande.
Est-ce possible de faire différemment?
Réponses:
Ce script fait l'affaire! Collez-le simplement en haut de votre fichier chauve-souris. Si vous souhaitez revoir la sortie de votre script, ajoutez une commande "pause" au bas de votre fichier batch.
MISE À JOUR: Ce script est maintenant légèrement modifié pour prendre en charge les arguments de ligne de commande et un système d'exploitation 64 bits.
Merci Eneerge @ https://sites.google.com/site/eneerge/scripts/batchgotadmin
la source
Voici un one-liner que j'utilise:
Remarques:
la source
am_admin
if not "%1"=="am_admin" (powershell start -verb runas '%0' 'am_admin "%~1" "%~2"' & exit)
Les paramètres seront l'un au-dessus de l'endroit où ils se trouvaient'am_admin %*'
pour tout passer, ne joue pas bien avec les guillemets et les espaces tho: / Vous pouvez utilisershift
en batch pour faire sauter le premier argument, corrigeant ainsi tous les arguments sauf%0
.cd /D %~dp0
aprèsif not "%1"=="am_admin" (powershell start -verb runas '%0' am_admin & exit /b)
Voici mon code! Cela a l'air gros mais ce sont surtout des lignes de commentaires (les lignes commençant par: :).
Fonctionnalités:
Vérification du dossier mappé (vous avertit si l'administrateur ne peut pas accéder au lecteur mappé)
Peut être utilisé comme bibliothèque externe (consultez mon article à ce sujet: https://stackoverflow.com/a/30417025/4932683 )
Attachez-le simplement à la fin de votre fichier batch ou enregistrez-le en tant que bibliothèque (vérifiez ci-dessus)
Exemple d'utilisation
la source
&fc;: 2>nul
dansset "_FN=_%~ns1" & echo/%TEMP%| findstr /C:"(" >nul && (echo/ERROR: %%TEMP%% path can not contain parenthesis &pause &endlocal &fc;: 2>nul & goto:eof)
définissait le niveau d'erreur à 1. J'ai supprimé ce bit et cela a fonctionné parfaitement. J'utilise Windows 10 Famille.fc;:
puisqu'il va: eof juste après? Je ne sais pas non plus pourquoi ce petit élément a causé le problème, car il devrait être exécuté.echo/%TEMP%| findstr /C:"(" >nul
tests s'il y a un caractère(
dans votre%temp%
variable d'environnement et ne devraient exécuter la partie qu'après le&&
si positif.(
Cependant, il est étrange que votre test soit positif.Une autre approche consiste à
puis
la source
La solution de Ben Gripka provoque des boucles infinies. Son lot fonctionne comme ceci (pseudo code):
Comme vous pouvez le voir, cela provoque une boucle infinie, si le VBS échoue à demander les privilèges d'administrateur.
Cependant, la boucle infinie peut se produire, bien que les privilèges d'administrateur aient été demandés avec succès.
L'enregistrement dans le fichier batch de Ben Gripka est juste sujet aux erreurs. J'ai joué avec le lot et observé que les privilèges d'administrateur sont disponibles bien que la vérification ait échoué. Fait intéressant, la vérification a fonctionné comme prévu, si j'ai démarré le fichier de commandes à partir de l'explorateur Windows, mais ce n'est pas le cas lorsque je l'ai démarré à partir de mon IDE.
Je suggère donc d'utiliser deux fichiers batch séparés. Le premier génère le VBS qui appelle le deuxième fichier batch:
Le second, nommé "my_commands.bat" et situé dans le même répertoire que le premier contient vos commandes réelles:
Cela ne provoque pas de boucles infinies et supprime également la vérification des privilèges d'administrateur sujette aux erreurs.
la source
Une autre solution PowerShell ...
Il ne s'agit pas d'exécuter un script batch en tant qu'administrateur, mais plutôt de savoir comment élever un autre programme du batch ...
J'ai un fichier batch "wrapper" pour un exe. Ils ont le même "nom de fichier racine", mais des extensions alternatives. Je suis capable de lancer l'exe en tant qu'administrateur et de définir le répertoire de travail sur celui contenant le script, avec l' invocation PowerShell d' une ligne suivante :
Plus d'informations
Il existe également toute une série d'
Start-Process
options supplémentaires que vous pouvez appliquer! Découvrez: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-6Notez que j'utilise le
@
préfixe. C'est équivalent à@echo off
pour une ligne. J'utilise%~n0
ici pour obtenir le "nom racine" du script batch, puis je concatène le.exe
pour le pointer vers le binaire adjacent. L'utilisation de%~dp0
fournit le chemin d'accès complet au répertoire dans lequel réside le lot. Et, bien sûr, le-Verb RunAs
paramètre fournit l'élévation .la source
Je sais que ce n'est pas une solution pour OP, mais comme je suis sûr qu'il existe de nombreux autres cas d'utilisation ici, j'ai pensé partager.
J'ai eu des problèmes avec tous les exemples de code dans ces réponses, mais j'ai trouvé: http://www.robotronic.de/runasspcEn.html
Il vous permet non seulement d'exécuter en tant qu'administrateur, mais il vérifie le fichier pour s'assurer qu'il n'a pas été falsifié et stocke les informations nécessaires en toute sécurité. J'admets que ce n'est pas l'outil le plus évident pour comprendre comment l'utiliser, mais pour ceux d'entre nous qui écrivent du code, cela devrait être assez simple.
la source
@echo off
ettitle
peut venir avant ce code:Beaucoup d'autres réponses sont exagérées si vous n'avez pas à vous soucier de ce qui suit:
cd %~dp0
passe au répertoire contenant le fichier de commandes)la source
Ce qui précède fonctionne sur mon Windows 10 version 1903
la source
Comme j'ai des problèmes avec ce script qui affiche une nouvelle invite de commande avec elle-même à nouveau, en boucle infinie (en utilisant Win 7 Pro), je vous suggère d'essayer une autre approche: Comment puis-je élever automatiquement mon fichier de commandes, afin qu'il demande à Droits d'administrateur UAC si nécessaire?
Attention, vous devez ajouter ceci à la fin du script, comme indiqué dans une modification, afin que vous soyez de retour dans le répertoire du script après l'élévation des privilèges: cd / d% ~ dp0
la source
Sur la base de l'article de toster-cx et d'autres articles intéressants sur cette page, j'ai eu un aperçu de la configuration et de la résolution de mon problème. J'ai eu un problème similaire où je souhaitais que l'utilitaire de nettoyage de disque s'exécute chaque semaine deux fois le lundi et le jeudi pendant les heures du déjeuner (par exemple, 14 heures). Cependant, cela exigeait des droits élevés.
Partager un fichier batch qui pourrait aider d'autres débutants comme moi -
Merci beaucoup pour ce forum et Rems POST ici [ https://www.petri.com/forums/forum/windows-scripting/general-scripting/32313-schtasks-exe-need-to-pass-parameters-to-script ][1]
Son message a aidé à configurer l'argument facultatif lors de la planification de la tâche.
la source
Il y a aussi la requête FSUTIL de cet article qui est également liée à ss64.com qui a le code suivant:
Tant que FSUTIL est là, c'est une alternative fiable.
la source
Vous ne pouvez pas demander les droits d'administrateur à partir d'un fichier de commandes, mais vous pouvez écrire un script hôte de script Windows dans% temp% et l'exécuter (et qui à son tour exécute votre lot en tant qu'administrateur). Vous voulez appeler la méthode ShellExecute dans le Shell. Objet d'application avec "runas" comme verbe
la source
Utilisez
mshta
pour demander les droits d'administrateur:Ou, en utilisant PowerShell:
la source
J'ai utilisé plusieurs exemples pour patcher cette doublure fonctionnant ensemble.
Cela ouvrira votre script batch en tant que
ADMIN + Maximized Window
Ajoutez simplement l'un des codes suivants en haut de votre script batch. Les deux méthodes fonctionnent, juste différentes façons de le coder.
Je pense que le premier exemple répond le plus rapidement en raison de la
/d
désactivation de mes commandes doskey que j'ai activées.EXAMPLE ONE
EXAMPLE TWO
Voir ci-dessous pour des recommandations sur l'utilisation de votre code de lot d'origine
Placez le code de lot d'origine
in it's entirety
Juste parce que la première ligne de code tout en haut a
@ECHO OFF
n'est pas que vous ne devez pas l'inclure à nouveau si votre script d'origine l'a également.Cela garantit que lorsque le script est redémarré dans une nouvelle fenêtre s'exécutant maintenant en mode administrateur, vous ne perdez pas vos paramètres / attributs de script prévus ... tels que le répertoire de travail actuel, vos variables locales, etc.
Vous pouvez commencer par les commandes suivantes pour éviter certains de ces problèmes
la source
utilisez la commande runas. Mais, je ne pense pas que vous puissiez envoyer un fichier .bat facilement.
la source
runas
commande ne peut pas être utilisée pour provoquer une élévation.