Довольно простой вопрос, на который я не могу найти ответ.
serverfault ранее помогал мне с поиском способа автоматизировать обновления Windows без использования WSUS. Он работает фантастически, но чтобы запустить его по сети, вам нужно сначала смонтировать общий диск. Это довольно просто XP, поскольку вы просто подключаете диск и запускаете программу обновления.
Однако в Vista и W7 все это нужно делать с повышенными привилегиями для правильной работы. Учетная запись UAC не может видеть сетевые диски, подключенные обычным пользователем, поэтому, чтобы все работало, мне нужно смонтировать общий ресурс через net use
из расширенной оболочки. Я хотел бы автоматизировать монтирование этого ресурса и запуск программы обновления через простой файл .bat.
Я, вероятно, мог бы просто проинструктировать всех щелкнуть правой кнопкой мыши «Запуск от имени администратора» в файле .bat, но я бы хотел, чтобы все было как можно проще, и чтобы .bat автоматически предлагал пользователю повысить свои привилегии.
Поскольку эти компьютеры нам не принадлежат, я не могу рассчитывать на установку чего-либо вроде Powershell, так что это определяет любое решение в этом направлении и в значительной степени должно полагаться на вещи, которые будут включены в установку RTM Vista. Я надеюсь, что мне здесь не хватает чего-то очевидного. :)
http://technet.microsoft.com/en-us/magazine/2007.06.utilityspotlight.aspx
РЕДАКТИРОВАТЬ: Если вы даете заказчику один файл для запуска, почему бы не создать самораспаковывающийся RAR с WinRAR и установить флаг «Требуется администратор» в параметрах SFX? Это освобождает вас от ограничения в один файл, и у вас могут быть все необходимые ресурсы.
В качестве альтернативы создайте свой SFX с помощью вашего любимого инструмента SFX и используйте инструменты повышения уровня выше.
Если вы готовы перейти на PowerShell, это сделать намного проще. Это мое "Elevate-Process.ps1
"сценарий (с su
как псевдоним в моем профиле):
# 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
Обнаружение возвышения также может быть выполнено в PSH (таким образом, вы можете проверить высоту, а затем при необходимости повысить):
$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
}
вот пример сценария, который я придумал, надеюсь, он поможет другим. Это bat-файл, который запрашивает у пользователя разрешение, а затем расширяется. Он выдает некоторый vbscript, который запускает приглашение UAC, а затем повторно запускает файл bat с повышенными правами ... http://jagaroth.livejournal.com/63875.html
Это то, что вам нужно: http://sites.google.com/site/eneerge/home/BatchGotAdmin
FusionInventory.org - это решение с открытым исходным кодом, которое в основном используется небольшими ремонтными мастерскими. Это может быть похоже на вашу персональную удаленно управляемую программу обновления Windows.
Ни одно из этих решений не работает с файлом .cmd, которому необходимо учитывать параметры командной строки. Поместите это в самое начало файла .cmd и все ваши проблемы будут решены. (Это для будущих людей, просматривающих эту ветку [я тестировал это на Windows XP, 7 Vista и 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---------------------
Как сказал @emilio, этот скрипт в порядке, но не принимает никаких аргументов. Вот модифицированный скрипт для совместимости с аргументами:
:: 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"
:--------------------------------------
Если вы не можете полагаться на установку Powershell, вы можете воспользоваться этим решением на StackOverflow:
автоматическое повышение с помощью UAC с помощью командного файла
Он не требует установки и запускается сразу после установки. Если вам нужно сохранить аргументы командной строки, рассматривать этот Обновить.
Вы пробовали runas
команда?