使用RunOnce以管理员身份运行批处理文件

时间:2015-12-14 14:59:23

标签: windows batch-file

我在各种机器上安装了一个程序,需要手动更新。

我将所有更新的文件存储在服务器上的共享中,并编写了一个批处理文件,将这些文件复制到正确的本地目录(Program Files(x86))

我的计划是部署一个组策略,该策略将在RunOnce上执行此批处理文件,在用户首次登录时更新程序。

问题是要写入目录,我必须以管理员身份运行批处理文件。

如何使用RunOnce执行此操作?还有另外一种方法吗?

我尝试过使用RoboCopy,但只是获得“拒绝访问”和同样的问题。

以下是我的批处理文件代码。

IF EXIST "C:\Program Files (x86)\NetHelpDesk\\." (goto CopyNetHelp) else Goto ExitLoop

:CopyNetHelp

COPY "\\server\programs\Nethelpdesk\NetHelpUpgrade\nethdclient.exe" "C:\Program Files (x86)\NetHelpDesk\" /y

COPY "\\server\programs\Nethelpdesk\NetHelpUpgrade\NetHelpDeskClientUpdater.exe" "C:\Program Files (x86)\NetHelpDesk\" /y

COPY "\\server\programs\Nethelpdesk\NetHelpUpgrade\nhescalatorclient.exe" "C:\Program Files (x86)\NetHelpDesk\" /y

:ExitLoop

Exit

2 个答案:

答案 0 :(得分:1)

试试这个:

@echo off
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (GOTO askAdmin)
GOTO gotAdmin
:askAdmin
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"
:: batch is being ran as admin
:skipAdmin

IF EXIST "C:\Program Files (x86)\NetHelpDesk\\." (goto CopyNetHelp) else Goto ExitLoop

:CopyNetHelp

COPY "\\server\programs\Nethelpdesk\NetHelpUpgrade\nethdclient.exe" "C:\Program Files (x86)\NetHelpDesk\" /y

COPY "\\server\programs\Nethelpdesk\NetHelpUpgrade\NetHelpDeskClientUpdater.exe" "C:\Program Files (x86)\NetHelpDesk\" /y

COPY "\\server\programs\Nethelpdesk\NetHelpUpgrade\nhescalatorclient.exe" "C:\Program Files (x86)\NetHelpDesk\" /y

:ExitLoop

Exit

答案 1 :(得分:0)

只是为了将来的搜索,这就是我开始工作的方式。 我创建了一个新的批处理文件。这将是从RunOnce运行的那个。 如果需要,这只是将“真实”批处理文件复制到用户文档文件夹中。然后它从文档文件夹中调用该批处理文件,从而在本地运行它来解决问题。

Dennis发布的“真实”批处理文件然后运行,一旦完成,就从文档文件夹中删除自己。

复制批次

IF EXIST "C:\Program Files (x86)\NetHelpDesk\\." (goto CopyNetHelp) else Goto ExitLoop
:CopyNetHelp
copy "\\server\data\pc_support\UpdateNetHelpAdmin.bat" "%USERPROFILE%\Documents" /y

"%USERPROFILE%\Documents\UpdateNetHelpAdmin.bat"

:ExitLoop
Exit

“真实”批处理文件

@echo off


>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (GOTO askAdmin)
GOTO gotAdmin
:askAdmin
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"
:: batch is being ran as admin
:skipAdmin

IF EXIST "C:\Program Files (x86)\NetHelpDesk\\." (goto CopyNetHelp) else Goto ExitLoop

:CopyNetHelp

COPY "\\server\programs\Nethelpdesk\NetHelpUpgrade\nethdclient.exe" "C:\Program Files (x86)\NetHelpDesk\" /y

COPY "\\server\programs\Nethelpdesk\NetHelpUpgrade\NetHelpDeskClientUpdater.exe" "C:\Program Files (x86)\NetHelpDesk\" /y

COPY "\\server\programs\Nethelpdesk\NetHelpUpgrade\NhEscalatorClient.exe" "C:\Program Files (x86)\NetHelpDesk\" /y


del "%USERPROFILE%\Documents\UpdateNetHelpAdmin.bat" /q


:ExitLoop

del "%USERPROFILE%\Documents\UpdateNetHelpAdmin.bat" /q

Exit