Comment puis-je auto-élever mon fichier batch, de sorte qu'il demande de l'UAC des droits d'administrateur, si nécessaire?
Je veux que mon fichier de commandes pour exécuter uniquement élevées. Si pas élevé, la possibilité pour l'utilisateur de relancer lot élevé.
Je suis en train d'écrire un fichier de commandes pour définir une variable système, copiez les deux fichiers dans un Fichiers de Programme emplacement, et de commencer un programme d'installation du pilote. Si un Windows 7/Windows utilisateur de Vista (Contrôle de compte d'utilisateur permis, et même si ils sont un admin local) s'exécute sans un clic droit et en sélectionnant "Exécuter en tant qu'Administrateur", ils seront "Accès Refusé" copier les deux fichiers et d'écriture de la variable système.
Je voudrais utiliser une commande pour redémarrer automatiquement le lot élevée si l'utilisateur est en fait un administrateur. Sinon, si ils ne sont pas un administrateur, je veux leur dire qu'ils ont besoin des privilèges d'administrateur pour exécuter le fichier de commandes. Je suis en utilisant xcopy pour copier les fichiers et REG ADD d'écrire la variable système. Je suis l'aide de ces commandes pour faire face à d'éventuelles Windows XP machines. J'ai trouvé les mêmes questions sur ce sujet, mais rien qui traite de la relance d'un fichier de commandes élevé.
- Découvrez ce que j'ai posté - vous n'avez besoin d'aucun outil externe, le script vérifie automatiquement les droits d'admin et de l'auto-élève lui-même si nécessaire.
- Veuillez prendre en considération si Matt réponse serait la cochées un? Semble donc, pour moi.
- double possible de Comment demander un accès Administrateur à l'intérieur d'un fichier de commandes
- Veuillez considérer la Windows 10 conseils dans la section des commentaires de la script batch j'ai posté.
- Cmd:
@powershell Start-Process cmd -Verb runas
. À partir de Powershell il suffit de déposer@powershell
. Cela commence cmd avec des droits élevés. - Ou essayez pure façon dont windows à l'aide de schtasks: stackoverflow.com/questions/19098101/...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez avoir l'appel du script lui-même avec psexec's
-h
option pour exécuter élevée.Je ne suis pas sûr de savoir comment vous permettrait de détecter si il est déjà en cours d'exécution élevé ou pas... peut-être re-essayer avec élévation de la prems seulement si il y a une erreur d'Accès Refusé?
Ou, vous pouvez simplement avoir les commandes pour la
xcopy
etreg.exe
toujours être exécuté avecpsexec -h
, mais il serait gênant pour l'utilisateur final si ils ont besoin pour entrer son mot de passe à chaque fois (ou d'insécurité si vous avez inclus le mot de passe dans le script)...psexec -h
ne fonctionne pas: 'ne Pouvait pas installer PSEXESVC service: l'Accès est refusé.'. Vous devez avoir les droits d'administrateur pour exécuter psexec.Il est un moyen facile, sans avoir à utiliser un outil externe - il fonctionne très bien avec Windows 7, 8, 8.1 et 10 et est rétro-compatible aussi (Windows XP n'ont pas de contrôle de compte d'utilisateur, ainsi, l'élévation n'est pas nécessaire - dans ce cas, le script continue simplement).
Découvrez ce code (j'ai été inspiré par le code par NIronwolf posté dans le fil Fichier de commandes - "Accès Refusé" Sur Windows 7?), mais je me suis amélioré dans ma version il n'y a pas de répertoire créé et supprimé pour vérifier les privilèges d'administrateur):
Le script prend avantage du fait que
NET FILE
nécessite des privilèges d'administrateur et retourneerrorlevel 1
si vous ne l'avez pas. L'élévation est réalisé en créant un script qui re-lance le fichier de commandes pour obtenir des privilèges. Cela permet à Windows de présenter la boîte de dialogue contrôle de compte d'utilisateur et vous demande pour le compte d'administrateur et le mot de passe.Je l'ai testé avec Windows 7, 8, 8.1, 10 et Windows XP, il fonctionne très bien pour tous.
L'avantage est, après le point de départ, vous pouvez placer tout ce qui nécessite des privilèges d'administrateur système, par exemple, si vous avez l'intention de ré-installer et ré-exécuter un service Windows à des fins de débogage (suppose que mypackage.msi est un service package d'installation):
Sans ce privilège élévation de script, contrôle de compte d'utilisateur vous demande trois fois pour votre compte d'utilisateur administrateur et le mot de passe - maintenant vous êtes demandé qu'une seule fois au début, et seulement si nécessaire.
Si votre script ne doit afficher un message d'erreur et la sortie s'il n'y a pas de privilèges d'administrateur au lieu de auto-élévatrices, c'est encore plus simple: Vous pouvez atteindre cet objectif en ajoutant ce qui suit au début de votre script:
De cette façon, l'utilisateur doit cliquer avec le bouton droit et sélectionnez "Exécuter en tant qu'administrateur". Le script va procéder après la
REM
déclaration s'il détecte des droits d'administrateur, sinon la sortie avec une erreur. Si vous n'avez pas besoin de l'PAUSE
, suffit de le retirer.Important:
NET FILE [...] EXIT /D)
doit être sur la même ligne. Il est affiché ici en plusieurs lignes pour une meilleure lisibilité!Sur certaines machines, j'ai rencontré des problèmes qui sont résolus dans la nouvelle version ci-dessus déjà. L'un était dû à différents devis double manipulation, et l'autre problème était dû au fait que l'UAC est désactivé (niveau le plus bas) sur un Windows 7 de la machine, d'où le script s'appelle elle-même, encore et encore.
J'ai fixé cette maintenant en enlevant les guillemets dans le chemin d'accès et le rajouter plus tard, et j'ai ajouté un paramètre supplémentaire qui est ajouté lorsque le script re-lance avec des droits élevés.
Supprimer les guillemets doubles par le texte suivant (les détails sont ici):
Vous pouvez ensuite accéder au chemin d'accès en utilisant
!batchPath!
. Il ne contient pas de guillemets, de sorte qu'il est sûr de dire"!batchPath!"
plus tard dans le script.La ligne
vérifie si le script a déjà été appelé par le VBScript script pour but d'élever les droits, donc en évitant les interminables récurrences. Il supprime le paramètre à l'aide de
shift
.Mise à jour:
Pour éviter d'avoir à s'inscrire à la
.vbs
extension dans Windows 10, j'ai remplacé la ligne"%temp%\OEgetPrivileges.vbs"
par l'
"%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs"
dans le script ci-dessus; aussi ajouté
cd /d %~dp0
comme suggéré par Stephen (réponse distincte) et par Tomáš Zato (commentaire) pour paramétrer le répertoire de script par défaut.Maintenant, le script honneurs paramètres de ligne de commande passé pour elle. Grâce à jxmallet, TanisDLJ et Peter Mortensen pour des observations et des inspirations.
Selon Artjom B. l'astuce, je l'ai analysée et ont remplacé
SHIFT
parSHIFT /1
, qui conserve le nom de fichier pour le%0
paramètreAjouté
del "%temp%\OEgetPrivileges_%batchName%.vbs"
à la:gotPrivileges
section pour nettoyer (comme mlt suggéré). Ajouté%batchName%
d'éviter les impacts si vous exécutez différents lots en parallèle. Notez que vous devez utiliserfor
pour être en mesure de profiter de l'avancée de la chaîne de fonctions, telles que%%~nk
, qui extrait juste le nom de fichier.Optimisé la structure de script, des améliorations (ajouté variable
vbsGetPrivileges
qui est maintenant référencé partout, ce qui permet de changer le chemin d'accès ou le nom du fichier facilement, seulement supprimer.vbs
fichier si le lot devait être élevée)Dans certains cas, une autre syntaxe d'appel a été nécessaire pour l'élévation. Si le script ne fonctionne pas, vérifiez les paramètres suivants:
set cmdInvoke=0
set winSysFolder=System32
Soit modifier le 1er paramètre
set cmdInvoke=1
et de vérifier si déjà cela résout le problème. Il va ajoutercmd.exe
pour le script d'exécution de l'élévation.Ou essayer de changer le 2e paramètre de
winSysFolder=Sysnative
, cela peut aider (mais il est dans la plupart des cas n'est pas nécessaire) sur les systèmes 64 bits. (ADBailey a signalé ce). "Sysnative" n'est requis pour lancer les applications 64 bits 32 bits hôte de script (par exemple, Visual Studio processus de construction, ou d'un script invocation à partir d'une autre application 32 bits).Pour la rendre plus claire la façon dont les paramètres sont interprétés, je suis affichant désormais comme
P1=value1 P2=value2 ... P9=value9
. Ceci est particulièrement utile si vous avez besoin de joindre les paramètres comme des chemins dans les guillemets, par exemple"C:\Program Files"
.Liens utiles:
Les guillemets ("), Bang (!), Caret (^), Esperluette (&), D'autres caractères spéciaux
cd %~dp0
avant de votre propre code. Sinon, vous trouverez que votre répertoire de travail est quelque chose commeC:\Windows\System32
. Imaginez que votre script accidentellement change quelque chose y....vbs
fichiers" et cliquez sur OK. La prochaine fois (et de tous les temps) le lot fonctionne très bien comme il l'a fait dans Win7/8.ftype VBSFile="%SystemRoot%\System32\WScript.exe" "%1" %*
et puisassoc .vbs=VBSFile
dans un admin fenêtre de la console. Il enregistre la.vbs
extension de l'utiliser avec Windows Script Host - apparemment Windows 10 n'a pas cette association tout est plus par défaut, de sorte que vous avez à le faire qu'une fois..vbs
extensions comme mentionné ci - dessus, alors vous pouvez remplacer la ligne"%temp%\OEgetPrivileges.vbs"
dans le script par"%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs"
, qui ont également travaillé très bien pour moi.%SystemRoot%\System32\WScript.exe
est installé sur votre machine, puis vérifier mes conseils que j'ai donné plus tôt pour VitaminYes (au sujet de l'inscription viaftype
etassoc
). Vous devrez peut-être installer/activer Windows Scripting Host, ce qui serait inhabituel parce qu'il sort de la boîte, dans Windows 7 normalement.UAC.ShellExecute "C:\Users\Me\Documents\script.bat", "ELEV", "", "runas", 1
. Aussi, j'ai de drôles de Windows apparemment, parce queNET FILE
ne donne pas une exception(oui, j'ai vérifié, je ne suis pas admin. J'ai dû modifier la case utiliser mkdir interdites répertoire..cmd
, par exempleelevate.cmd
. Il se peut également que votre installation de Windows ont des problèmes et a besoin d'un rafraîchissement (nouvelle installation) - j'ai testé le lot sur plusieurs Pc et trouvé aucune erreur comme vous l'avez décrit. Essayez-la sur un collègue PC pour le savoir. Je ne peux pas donner de prise en charge sur votre installation de Windows.SHIFT
est la solution, mais en ajoutant un/1
paramètre à laSHIFT
de commande (voir la liste à jour). Il devrait fonctionner correctement maintenant. Merci pour avoir porté à mon attention!%TEMP%
et supprimerOEgetPrivileges.vbs
lors de la résiliation?B.bat
, mais que vous souhaitez utiliserA.bat
juste pour éleverB.bat
. Si c'est le cas, appelezB.bat
après la::Start
section deA.bat
(c'est à dire faire le chemin inverse).Elevate.cmd "1st param" "2nd param" "3rd param"
ils sont transmis de cette façon, lors de l'élévation comme%1
...%3
. Si vous omettez les guillemets, ils sont interprétés comme1st param 2nd param 3rd param
, qui est%1
...%6
à la place.%SystemRoot%\System32\WScript.exe
avec%SystemRoot%\Sysnative\WScript.exe
pour forcer l'utilisation de 64 bits WScript.C:\Windows\System32
etC:\Windows\SysWow64
, mais pasC:\Windows\Sysnative
. Dans les deux chemins d'accès, vous pouvez trouverWscript.exe
.SysNative
n'est pas un "vrai" directory, juste une caractéristique de la Redirecteur de Système de Fichier que Windows utilise pour les applications 32 bits sur 64 bits de Windows. Dans de tels cas, les demandes dec:\Windows\System32
êtes redirigé versc:\Windows\SysWow64
, tout en demandantc:\Windows\Sysnative
est une manière de dire "oui, je suis d'une application 32 bits qui est consciente de l'OS 64 bits et je veux vraiment le bon System32". Vous pouvez faire un essai en cours d'exécutionc:\Windows\SysWow64\cmd.exe
(32-bit) et la liste des répertoires.Sysnative
est seulement si votre (Élever.cmd) le script est toujours en cours d'exécution dans un hôte 32 bits: 64 bits de l'hôte,Sysnative
ne sera pas trouvé. Si vous voulez qu'il soit flexible, soit (comme j'ai fait), vous devez ajouter un rapide "s'il existe un" état de basculer entre lesSysnative
etSystem32
. C'est une niche problème et peut-être trop pointilleux pour modifier votre fourni de réponse, mais j'ai pensé que l'information serait utile si quelqu'un d'autre a couru vers elle.Elevate64.cmd
pour la version 64 bits, etElevate.cmd
pour la version 32 bits. La raison en est que ce script aurait plus de dépendances à 64 bits de code et de nombreux CAS de compliquer les choses ...System32
... cela devrait rendre la vie plus facile pour vous. Aussi, j'ai remarqué que sur certains systèmes, une 2ème modification n'est nécessaire, voir la mise à jour section dans la réponse.Elevate.cmd
script se termine aveccmd /k
. Cela ne crée un nouveau processus de shell et d'y rester?pushd .
cela semble pas très utile sans un correspondantpopd
. Il a également lacd /D
à bord, ainsi que je comprends l'explication ici: Pushd - changer de répertoire/dossier | Windows CMD | SS64.com ...et mes observations personnelles/d
paramètre est nécessaire pour s'assurer que le lecteur est également modifiées en cas de besoin, non seulement le chemin. La commandepushd .
peut éventuellement être retiré, il était là depuis le début du développement. Si vous (ou quelqu'un qui a déjà enlevé et l'a testé) peut confirmer, je peux le supprimer./d
option pourcd
, mais depuis que je suis en utilisant une combinaison depushd
(ce qui implicitement necd /d
-- c'est en fait le but du paramètre) etpopd
, je n'ai pas besoin de l'appointcd /d
. Dans votre cas, ici, je suggère seulement de supprimer les inutiles& pushd .
0
dans un1
? -- Je suis un peu confus. (BTW: il y a aussi une faute de frappe à gauche de mon dernier montage que j'ai fixé maintenant.)Exit /b
assure que seuls les appelés instance sort correctement après l'élévation mécanisme est appelé.Comme jcoder et Matt mentionné, PowerShell, il est facile, et il pourrait même être intégré dans le script de commandes sans créer un nouveau script.
J'ai modifié Matt script:
Il n'y a pas besoin de la
:getPrivileges
étiquette.Je suis à l'aide de Matt excellente réponse, mais je vois une différence entre mon Windows 7 et Windows 8 de systèmes d'lors de l'exécution élevée de scripts.
Une fois que le script est élevée sur Windows 8, le répertoire courant est réglé à
C:\Windows\system32
. Heureusement, il est facile de contourner ce problème en changeant le répertoire courant pour le chemin d'accès du script courant:Remarque: Utilisez
cd /d
à assurez-vous que la lettre de lecteur est également modifiée.Pour tester cela, vous pouvez copier ce qui suit dans un script. Exécuter normalement sur les deux versions pour voir le même résultat. Exécuter en tant qu'Admin et voir la différence dans Windows 8:
cd %~dp0
à conserver son chemin d'accès actuel (je suppose que cela fonctionne dans Win7 ainsi, de sorte que la même commande peut être utilisée bien que seulement nécessaire pour Win8+). +1 pour cet!pushd %~dp0
plutôt... pourquoi? parce quepopd
Je faire de cette façon:
De cette façon, c'est simple et utiliser windows uniquement les commandes par défaut.
C'est génial si vous avez besoin de redistribuer les vous fichier de commandes.
CD /d %~dp0
Définit le répertoire courant les fichiers du répertoire courant (si ce n'est déjà fait, quel que soit le disque le fichier est en cours, grâce à la/d
option).%~nx0
Retourne le nom de fichier avec l'extension (Si vous n'incluez pas l'extension et il y a un exe avec le même nom sur le dossier, il va appeler le exe).Il ya tellement de nombreuses réponses sur ce post, je ne sais même pas si ma réponse va être vu.
De toute façon, je trouve cela plus simple que les autres solutions proposées sur les autres réponses, j'espère que cela aide quelqu'un.
/d
option de laCD
commande? (BTW: vous avez un savoureux piano photo dans votre profil)CD
de commande ici (ainsi que d'autres commandes): technet.microsoft.com/en-us/library/bb490875.aspx La/d
commande modifie le lecteur actuel (ou chemin d'accès complet) avec qui vous travaillez. C'est à peu près la même chose que ne pas explicitement à l'aide de/d
apparemment.cd
commande ne permet pas de changer le lecteur (même si vous l'avez explicitement inclure le lecteur au début du chemin), tandis que la saisie de la lettre de lecteur plus côlon t-il. L'option /d comprend cette modification de la commande courante./d
interrupteur serait faire de votre réponse applicable également pour les scripts lancés à partir de clés usb et tous les disques autres que le lecteur système. (concernant l'image de profil: je suis en train de jouer du piano et de la recherche à ce clavier est plus amusant que de regarder sur mon clavier d'ordinateur.)/d
. Merci pal 🙂 (P. S.: le Pianiste ici aussi!)pushd %~dp0%
etpopd
) avec ces 3 lignes:SET DPZERO=%~dp0%
etSET NXZERO=%~nx0%
et (le reste de ce, jusqu'à la guillemet, est une longue ligne)MSHTA "javascript: var oShellApp = new ActiveXObject('Shell.Application'); var oWSH = new ActiveXObject('WScript.Shell'); oShellApp.ShellExecute('CMD', '/C ' + oWSH.Environment("Process")("DPZERO") + oWSH.Environment("Process")("NXZERO"), '', 'runas', 1);close();"
cd
commande pour le début (cela permet de s'assurer que le chemin d'accès est également disponible à l'élévation du script - sinon, l'élévation de script ne s'exécute à partir system32). Vous devez également rediriger la commande net à nul, pour le cacher de sortie:net session >nul 2>&1
Matt a une grande réponse, mais il élimine tous les arguments passés au script. Voici ma modification qui garde arguments. J'ai également incorporé Etienne correctif pour le problème de répertoire dans Windows 8.
ECHO UAC.ShellExecute....
ligne,"batchArgs!"
ne sera pas étendue variable. Utilisation"!batchArgs!"
. Mon montage a été rejetée, donc j'ai fait un commentaire.test.bat "a thing"
ou"test script.bat" arg1 arg2
. Tous les fixes maintenant.- Je utiliser PowerShell pour re-lancer le script élevée si elle ne l'est pas. Mettre ces lignes tout en haut de votre script.
J'ai copié le net le nom de " méthode de @Matt réponse. Sa réponse est beaucoup mieux documenté et a des messages d'erreur et autres. Celui-ci a l'avantage que PowerShell est déjà installé et disponible sur Windows 7. Aucune temporaire VBScript (*.vbs) des fichiers, et vous n'avez pas à télécharger des outils.
Cette méthode devrait fonctionner sans aucune configuration ou l'installation, aussi longtemps que votre PowerShell autorisations d'exécution ne sont pas verrouillés.
/c %~fnx0 %*'
partie semble laisser à chaque partie, en plus de la première. Par exemple à partir detest.bat "arg1 arg2 arg3"
seulement arg1 est passé avantnetsh int set int %wifiname% Enable/Disable
.net file 1>nul 2>nul && goto :run || powershell -ex unrestricted -Command "Start-Process -Verb RunAs -FilePath '%comspec%' -ArgumentList '/c ""%~fnx0""""'"
""%~fnx0"""" %*'"
. Si il y a des citations dans le autres paramètres, cependant, ils sont encore dépouillé.Pour certains programmes, le réglage de la super secret
__COMPAT_LAYER
variable d'environnement pourRunAsInvoker
va travailler.Vérifiez ceci :Bien qu'il n'y aura pas de contrôle de compte d'utilisateur de demander à l'utilisateur continuera sans autorisations d'administrateur.
J'ai collé ceci dans le début du script:
cacls
est déconseillée dans Windows 7 et versions plus récentes versions de windows.calcs
àicalcs
fonctionne très bien.pushd "%CD%"
enregistre le répertoire de travail actuel et les modifications du répertoire de travail actuel?Solution suivante est propre et fonctionne parfaitement.
Télécharger Élever fichier zip à partir de https://www.winability.com/download/Elevate.zip
À l'intérieur de zip, vous devriez trouver deux fichiers: Elevate.exe et Elevate64.exe. (Le dernier est un 64 bits natif de la compilation, si vous avez besoin que, bien que l'ordinaire de la version 32 bits, Elevate.exe, devrait fonctionner correctement avec 32 et les versions 64 bits de Windows)
Copier le fichier Elevate.exe dans un dossier où Windows peut toujours le trouver (comme C:/Windows). Ou vous mieux, vous pouvez le copier dans le même dossier où vous avez l'intention de garder votre fichier bat.
De l'utiliser dans un lot de fichier, il suffit de faire précéder la commande que vous souhaitez exécuter en tant qu'administrateur avec l'élévation de commande, comme ceci: