Запуск пакетного файла из другого пакетного файла в качестве администратора
Мне нужно запустить пакетный файл (setup.bat), который вызовет другой пакетный файл (make_dir.bat), который создаст папку в каталоге "C:\Program Files". Это для внутреннего установщика. Все пользователи будут авторизованы под своими именами, но будут иметь права локального администратора. Я пробовал два подхода, но ни один из них не работает.
Подход 1:
SET PRGFILES=%programfiles%\mySoftware
SET admin=N
SET domain=%USERDOMAIN%\
IF /i "%domain%" EQU "%computername%\" set domain=
SET user=%domain%%username%
FOR /f "Tokens=*" %%a IN ('net localgroup administrators^|find /i "%user%"') DO SET admin=Y
IF "%admin%"=="Y" (
MD "%PRGFILES%"
)
Это говорит Access is denied
Подход 2:
runas /user:%Username% shell\make_dir.bat
где make_dir.bat
md "%programfiles%\mySoftware"
This asks for the current username and password but somehow fails after that. I have checked that all users have local admin rights and can manually create a folder in their programfiles
папка.
Спасибо за помощь.
1 ответ
Я использую такой скрипт для запуска .bat файла от имени администратора, используя JScript:
var batch = "fixuac.bat" var fso = new ActiveXObject ("Scripting.FileSystemObject"); var curdir = fso.GetParentFolderName (WScript.ScriptFullName); var wbemFlagReturnImmediately = 0x10; var wbemFlagForwardOnly = 0x20; var objWMIService = GetObject ("winmgmts: \\\\. \\ root \\ CIMV2"); // var objWMIService = GetObject ("winmgmts:" + "{impersonationLevel = impersonate}! \\" + "." + "\ root \ cimv2"); var colItems = objWMIService.ExecQuery ("SELECT * FROM Win32_OperatingSystem", "WQL", wbemFlagReturnImmediately | wbemFlagForwardOnly); var enumItems = новый перечислитель (colItems); var objItem = enumItems.item(); // http://en.wikipedia.org/wiki/Ver_(command) var major_ver = objItem.Version.split(".")[0]; var objShell = new ActiveXObject("shell.application"); // http://msdn.microsoft.com/en-us/library/windows/desktop/gg537745.aspx // Shell.ShellExecute метод // iRetVal = Shell.ShellExecute( sFile, [ vArguments ], [ vDirectory ], [ vOperation ], [ vShow ]) // Если (vShow==1) открыть приложение с обычным окном. // Проверка для Vista и выше. if (major_ver >= 6) { // Запросить разрешение администратора. objShell.ShellExecute(batch, curdir, "", "runas", 1); } еще { objShell.ShellExecute(batch, curdir); }