3

我需要运行一个批处理文件(setup.bat),它将调用另一个批处理文件(make_dir.bat),它将在“C:\ Program Files”目录中创建一个文件夹。这适用于内部安装程序。所有用户都将使用他们的用户名登录,但将具有本地管理员权限。我尝试了两种方法,但都不起作用。

方法一:

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

方法二:

runas /user:%Username% shell\make_dir.bat

make_dir.bat 在哪里

md "%programfiles%\mySoftware"

这要求提供当前的用户名和密码,但之后不知何故失败了。我检查了所有用户都具有本地管理员权限,并且可以在他们的文件夹中手动创建一个文件programfiles夹。

谢谢您的帮助。

4

1 回答 1

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 方法
// iRetVal = Shell.ShellExecute( sFile, [ vArguments ], [ vDirectory ], [ vOperation ], [ vShow ] )
// 如果 (vShow==1) 以普通窗口打开应用程序。
// 检查 Vista 和更高版本。
如果 (major_ver >= 6) {
    // 请求管理员权限。
    objShell.ShellExecute(batch, curdir, "", "runas", 1);
} 别的 {
    objShell.ShellExecute(batch, curdir);
}
于 2012-08-07T08:47:14.483 回答