3

「C:\ ProgramFiles」ディレクトリにフォルダを作成する別のバッチファイル(make_dir.bat)を呼び出すバッチファイル(setup.bat)を実行する必要があります。これは内部インストーラー用です。すべてのユーザーは自分のユーザー名でログインしますが、ローカル管理者権限があります。私は2つのアプローチを試しましたが、どちらも機能しません。

アプローチ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フォルダーに手動でフォルダーを作成できることを確認しました。

助けてくれてありがとう。

4

1 に答える 1

2

このようなスクリプトを使用して、JScript を使用して.batファイルを管理者として実行します。

var バッチ = "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_(コマンド)
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(バッチ, curdir, "", "runas", 1);
} そうしないと {
    objShell.ShellExecute(バッチ、curdir);
}
于 2012-08-07T08:47:14.483 に答える