所以,我有一个常见问题,每个人似乎都试图以管理员身份运行存储在网络驱动器上的批处理文件。我已经浏览了互联网,并且有一些解决方法'但是如果我可以的话,我不确定如何应用它们。
实际任务:批处理文件(让我们调用此批#1)复制文件" mms.cfg"从网络驱动器(与批处理相同的dir)到system32和syswow64。当然,这些文件夹受到保护,因此需要以管理员身份运行。但是当您以管理员身份运行时,映射的网络驱动器并不存在于" admin"帐户和批次陨石坑。
在这个特定实例中,批处理#1运行静默安装的flash。之后,它需要将配置文件复制到上述受保护的文件夹以禁用其自动更新功能,因为我们的标准用户无法运行闪存否则会唠叨的更新(为什么adobe只能添加切换到他们的安装程序以关闭此功能?)。
我尝试了什么:我已经看到了在注册表中设置EnableLinkedConnections=1
的工作,但我需要将此批处理文件部署到网络上的多台PC上无法更改每个注册表项。
我以管理员身份运行后还尝试重新映射目录。再次,批处理陨石坑,因为它是从映射的网络驱动器和"管理员"我不知道这个驱动器是否存在,因此在我有机会映射驱动器之前崩溃(通过pushd
或其他)。
我不能简单地将批次复制到本地PC以便每次运行它: 1)它执行其他任务(启动两个安装程序), 2)批处理文件本身正在从另一个批处理(表示为批处理#2)运行,该批处理正在下载软件更新列表并静默应用它们, 3)这是在我(域)应用一系列更新admin)将登录到每台PC并运行批处理#2以更新一系列程序(域自动映射目录到更新,因此我导航到I:\ updates并运行它)。
最终结果我希望:从本质上讲,这归结为如何运行存储在具有管理权限的映射网络驱动器上的批处理?有没有办法在任何给定的联网机器上执行此操作,或者我是否简化为将我要更新的每台PC手动复制配置文件到system32和syswow64?
TLDR:以管理员身份运行存储在映射网络驱动器上的批处理,而不会产生漏洞。
如果我不清楚或需要提供更多信息,我会尽力回来查看。提前感谢您的帮助!
更新 - 因此,我可以通过GPO在域中的计算机上设置EnableLinkedConnections=1
。但是,我注意到了另一个有趣的问题:右键单击&以管理员身份运行,运行正常。但是,当您运行脚本时,包括以下代码以自动请求管理员权限现在会失败。也许我只是错过了一些简单的东西?
再次提前感谢您的帮助!
:: BatchGotAdmin
:-------------------------------------
REM --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
set params = %*:"=""
echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
exit /B
:gotAdmin
pushd "%CD%"
CD /D "%~dp0"
:--------------------------------------
答案 0 :(得分:1)
如果有其他人遇到此问题(像我一样),我的解决方法是转到UNC路径并创建批处理文件的快捷方式。然后,当您从映射驱动器以管理员身份运行快捷方式时,它将以UNC路径启动批处理文件。
答案 1 :(得分:0)
我使用这种批处理文件来运行网络映射驱动器中的命令或其他批处理文件。
@echo off
SETLOCAL EnableDelayedExpansion
set FULLPATH=%CD%
set DRIVE=%FULLPATH:~0,2%
set DIRECTORY=%FULLPATH:~2%
:: This script will run first time without admin rights and solve UNC path from the mapped drive path ot regular path if mapped drive is not used.
:: The script will pass the path as an argument %~2 for it self when the script is runned with admin rights.
for /f "tokens=* delims= " %%A in ('net use %DRIVE% 2^> nul ^| find /i "\\"') do set line=%%A
if "%line%" == "" (
:: If temp is empty, script is not on network mapped drive and a folder of the bat file should be used.
set UNCPATH=localfolder
) else (
set UNCNAME=%line:*\\=\\%
:: eg \\192.168.1.20\sharename
set "UNCPATH=!UNCNAME!!DIRECTORY!"
)
:: This will run the script second time and ask adming rights
if not "%1"=="am_admin" (powershell start -verb runas '%0' 'am_admin "!UNCPATH!"' & exit /b)
if "%~2" == "localfolder" (
pushd %~dp0
) else (
pushd %~2
)
::------------------------------------------------------------------------------
echo Place your code here^!
dir
echo CD: %CD%
echo Bat file DIR: %~dp0
::------------------------------------------------------------------------------
popd