Запуск пакетного файла из другого пакетного файла в качестве администратора

Мне нужно запустить пакетный файл (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);
}
Другие вопросы по тегам