我需要运行一个批处理文件(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"
这会询问当前的用户名和密码,但之后会以某种方式失败。我已检查所有用户是否具有本地管理员权限,并可以在其programfiles
文件夹中手动创建文件夹。
感谢您的帮助。
答案 0 :(得分:2)
我使用这样的脚本以管理员身份运行 .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 = new Enumerator(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 method // iRetVal = Shell.ShellExecute( sFile, [ vArguments ], [ vDirectory ], [ vOperation ], [ vShow ] ) // If (vShow==1) open the application with a normal window. // Check for Vista and upper. if (major_ver >= 6) { // Request admin permission. objShell.ShellExecute(batch, curdir, "", "runas", 1); } else { objShell.ShellExecute(batch, curdir); }