Élever l'UAC via le fichier .bat?

10

Une question assez simple à laquelle j'ai du mal à trouver une réponse.

serverfault m'a précédemment aidé à trouver un moyen d'automatiser les mises à jour Windows sans utiliser WSUS. Cela fonctionne à merveille, mais pour l'exécuter sur le réseau, vous devez d'abord monter un lecteur partagé. C'est assez simple XP car il vous suffit de monter le lecteur et d'exécuter le programme de mise à jour.

Sur Vista et W7, cependant, tout cela doit être fait avec des privilèges élevés pour fonctionner correctement. Le compte UAC ne peut pas voir les lecteurs réseau montés par l'utilisateur normal, donc pour que tout fonctionne, je dois monter le partage via net useun shell escaladé. J'aimerais automatiser le montage de ce partage et le lancement du programme de mise à jour via un simple fichier .bat.

Je pourrais probablement demander à tout le monde de cliquer avec le bouton droit de la souris sur "Exécuter en tant qu'administrateur" sur le fichier .bat, mais je voudrais que les choses soient aussi simples que possible et que le .bat invite automatiquement l'utilisateur à augmenter ses privilèges.

Étant donné que ces ordinateurs ne nous appartiennent pas, je ne peux pas compter sur l'installation de Powershell, de sorte que les règles de toute solution dans ce sens et doivent à peu près s'appuyer sur des éléments qui seraient inclus dans une installation RTM Vista. J'espère que je manque surtout quelque chose d'évident ici. :)

jslaker
la source

Réponses:

8

http://technet.microsoft.com/en-us/magazine/2007.06.utilityspotlight.aspx

EDIT: Si vous donnez au client un seul fichier à exécuter, pourquoi ne pas créer un RAR auto-extractible avec WinRAR et définir l'indicateur "Administrateur requis" dans les options SFX? Cela vous absout de votre limite de 1 seul fichier, vous pouvez avoir toutes les ressources dont vous avez besoin.

Vous pouvez également créer votre SFX en utilisant votre outil SFX préféré et utiliser les outils d'élévation ci-dessus.

ta.speot.is
la source
Je garderai cela à l'esprit, mais, encore une fois, j'essaie d'éviter d'installer quoi que ce soit supplémentaire car ces machines appartiennent à des tiers.
jslaker
Je pense que vous pouvez les utiliser sans les installer, il vous suffit de les empaqueter à côté de votre fichier batch.
ta.speot.is
Il y a plusieurs fichiers dans le téléchargement, mais il semble que tout ce dont vous auriez besoin pour votre besoin serait elevate.cmdetelevate.vbs
Suspendu jusqu'à nouvel ordre.
Si je peux emballer tout cela de manière assez autonome / portable, cela peut fonctionner. J'y regarderai de plus près quand j'aurai un peu plus de temps plus tard aujourd'hui.
jslaker
Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien de référence.
Mark Henderson
4

Si vous êtes prêt à convertir en PowerShell, c'est beaucoup plus facile à faire. Voici mon Elevate-Process.ps1script " " (avec sucomme alias dans mon profil):

# Updated elevate function that does not need Elevate PowerToys
# From http://devhawk.net/2008/11/08/My+ElevateProcess+Script.aspx


$psi = new-object System.Diagnostics.ProcessStartInfo
$psi.Verb = "runas"

# If passed multiple commands, or one (that isn't a folder) then execute that command:
if (($args.Length -gt 1) -or (($args.length -eq 1) -and -not (test-path $args[0] -pathType Container))) {

    $file, [string]$arguments = $args;
    $psi.FileName = $file  
    $psi.Arguments = $arguments
    [System.Diagnostics.Process]::Start($psi) | out-null
    return
}

# If from console host, handle case of one argyment that is
# a folder, to start in that folder. Otherwise start in current folder.
if ($host.Name -eq 'ConsoleHost') {
    $psi.FileName = (Get-Command -name "PowerShell").Definition
    if ($args.length -eq 0) {
        $psi.Arguments = "-NoExit -Command &{set-location '" + (get-location).Path + "'}"
    } else {
        $psi.Arguments = "-NoExit -Command &{set-location '" + (resolve-path $args[0]) + "'}"
    }
    [System.Diagnostics.Process]::Start($psi) | out-null
    return
}

# Otherwise this is some other host (which cannot be assumed to take parameters).
# So simplely launch elevated.
$psi.FileName = [system.diagnostics.process]::getcurrentprocess().path
$psi.Arguments = ""
[System.Diagnostics.Process]::Start($psi) | out-null

La détection de l'élévation peut également être effectuée dans PSH (vous pouvez donc vérifier l'élévation, puis élever si nécessaire):

$wid=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$prp=new-object System.Security.Principal.WindowsPrincipal($wid)
$adm=[System.Security.Principal.WindowsBuiltInRole]::Administrator
$IsAdmin=$prp.IsInRole($adm)
if ($IsAdmin) {
  $host.UI.RawUI.Foregroundcolor="Red"
  write-host "`n** Elevated Session **`n" -foreground $_errorColour -background $_errorBackound
}
Richard
la source
J'ai pensé que Powershell pouvait le faire, mais encore une fois, je ne peux pas compter sur l'installation de Powershell, et j'ai besoin de quelque chose d'aussi efficace et d'oublier que possible.
jslaker
@jslaker: cela peut certainement être un problème avec Vista / 2008. Mais PSH est inclus avec Win7 / 2008R2, cela devrait donc être plus facile. Dans une situation d'entreprise, cela pourrait-il être le moteur d'un déploiement?
Richard
Eh bien, ce n'est pas une situation d'entreprise. Il y a plus dans la question d'origine que j'ai liée, mais la version courte est que nous sommes un atelier de réparation de PC, et cela essaie essentiellement de contourner le fait que la licence WSUS vous interdit d'utiliser WSUS pour déployer des mises à jour sur des machines qui ne le sont pas. sous licence à votre organisation. Ce sont toutes des machines clientes qui pourraient exécuter n'importe quoi à partir de XP RTM. C'est pourquoi je ne peux pas vraiment compter sur quoi que ce soit installé qui ne serait pas inclus dans une installation RTM d'un système d'exploitation donné.
jslaker
Si vous ne pouvez pas vous fier à l'installation de Powershell, consultez la réponse que j'ai donnée ci-dessous.
Matt
3

voici un exemple de script que j'ai trouvé, j'espère qu'il aide les autres. Il s'agit d'un fichier de chauve-souris qui invite l'utilisateur à obtenir une autorisation, puis s'intensifie. Il envoie quelques vbscript qui déclenchent l'invite UAC puis réexécute le fichier bat élevé ... http://jagaroth.livejournal.com/63875.html

La chose
la source
2

Voici ce dont vous avez besoin: http://sites.google.com/site/eneerge/home/BatchGotAdmin

Emilio
la source
1
Ce script a un bug mineur, il ne transmet aucun paramètre. Mettez-les simplement dans la commande pour appeler votre script comme ceci: echo UAC.ShellExecute "% ~ s0", "% *", "", "runas", 1 >> "% temp% \ getadmin.vbs"
SvenS
1

FusionInventory.org est une solution open source principalement utilisée par les petits ateliers de réparation. Cela peut être comme votre programme de mise à jour Windows Windows contrôlé à distance.

rjt
la source
0

Aucune de ces solutions ne fonctionne pour un fichier .cmd qui doit être conscient des paramètres de ligne de commande. Mettez cela au tout début du fichier .cmd et tous vos problèmes seront résolus. (C'est pour les futures personnes parcourant ce fil [J'ai testé cela sur Windows XP, 7 Vista et 8; x86 + x64]):

@echo off
NET SESSION >nul 2>&1 && goto noUAC
title.
set n=%0 %*
set n=%n:"=" ^& Chr(34) ^& "%
echo Set objShell = CreateObject("Shell.Application")>"%tmp%\cmdUAC.vbs"
echo objShell.ShellExecute "cmd.exe", "/c start " ^& Chr(34) ^& "." ^& Chr(34) ^& " /d " ^& Chr(34) ^& "%CD%" ^& Chr(34) ^& " cmd /c %n%", "", "runas", ^1>>"%tmp%\cmdUAC.vbs"
echo Not Admin, Attempting to elevate...
cscript "%tmp%\cmdUAC.vbs" //Nologo
del "%tmp%\cmdUAC.vbs"
exit /b
:noUAC

::-----Normal Batch Starts Here---------------------
Grintor
la source
0

Comme l'a dit @emilio, ce script est OK mais il n'accepte aucun argument. Voici le script modifié pour être compatible avec les arguments:

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo args = "" >> "%temp%\getadmin.vbs"
    echo For Each strArg in WScript.Arguments >> "%temp%\getadmin.vbs"
    echo args = args ^& strArg ^& " "  >> "%temp%\getadmin.vbs"
    echo Next >> "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", args, "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs" %*
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------
TanisDLJ
la source
0

Si vous ne pouvez pas compter sur l'installation de Powershell, vous pouvez prendre cette solution sur StackOverflow:

élévation automatique avec UAC à l'aide d'un fichier de commandes

Il ne nécessite rien d'installation et fonctionne hors de la boîte. Si vous devez conserver les arguments de ligne de commande, envisagez cette mise à jour.

Mat
la source
-1

Avez-vous essayé la runascommande?

En pause jusqu'à nouvel ordre.
la source