Windows 批处理:以管理员身份从映射的网络驱动器运行

Windows 批处理:以管理员身份从映射的网络驱动器运行,windows,batch-file,networking,cmd,flash,Windows,Batch File,Networking,Cmd,Flash,所以,我有一个普遍的问题,每个人似乎都有一个试图以管理员的身份运行存储在网络驱动器上的批处理文件的问题。我浏览过互联网,有一些“变通方法”,但如果可以的话,我不知道如何应用它们 实际任务:批处理文件(让我们调用此批处理#1)将文件“mms.cfg”从网络驱动器(与批处理相同的目录)复制到system32和syswow64。当然,这些文件夹是受保护的,因此不需要以管理员身份运行。但是,当您以管理员身份运行时,“管理员”帐户和批处理帐户的映射网络驱动器不存在 在这个特定的实例中,batch#1运行一

所以,我有一个普遍的问题,每个人似乎都有一个试图以管理员的身份运行存储在网络驱动器上的批处理文件的问题。我浏览过互联网,有一些“变通方法”,但如果可以的话,我不知道如何应用它们

实际任务:批处理文件(让我们调用此批处理#1)将文件“mms.cfg”从网络驱动器(与批处理相同的目录)复制到system32和syswow64。当然,这些文件夹是受保护的,因此不需要以管理员身份运行。但是,当您以管理员身份运行时,“管理员”帐户和批处理帐户的映射网络驱动器不存在

在这个特定的实例中,batch#1运行一个静默安装的flash。之后,它需要将一个配置文件复制到前面提到的受保护文件夹中,以禁用其自动更新功能,因为我们的标准用户无法运行更新,否则flash会唠叨他们(为什么adobe不能在安装程序中添加一个开关来关闭此功能?)

我尝试的内容:我已经看到了在注册表中设置
EnableLinkedConnections=1
的方法,但我需要将此批处理文件部署到网络上的多台PC上,并且无法更改每台PC上的注册表项

我还尝试在以管理员身份运行后重新映射目录。同样,批处理会崩溃,因为它是从映射的网络驱动器运行的,“管理员”不知道该驱动器存在,因此在我有机会映射驱动器(通过
pushd
或其他方式)之前崩溃

我不能简单地将批处理复制到本地PC上,以便每次运行它:1)它执行其他任务(启动两个安装程序),2)批处理文件本身是从另一个批处理(表示为批处理#2)运行的,该批处理将记录软件更新列表并静默应用它们,3)这是应用一系列更新,其中我(域管理员)将登录到每台电脑并运行batch#2以更新一系列程序(域自动将目录映射到更新,因此我导航到I:\updates并运行它)

我希望的最终结果:本质上,这归结为如何运行存储在具有管理权限的映射网络驱动器上的批处理?是否有任何方法可以在任何给定的网络计算机上执行此操作,或者对于我要更新的每台PC,我是否已将配置文件手动复制到system32和syswow64

TLDR:以管理员身份运行存储在映射网络驱动器上的批处理,而不使其崩溃

如果我不清楚或者需要提供更多的信息,我会尽我最大的努力进行核实。提前感谢您的帮助

:: 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"
:--------------------------------------

更新-因此,我能够通过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"
:--------------------------------------

如果其他任何人(像我一样)遇到这个问题,我的解决方法是转到UNC路径并创建批处理文件的快捷方式。然后,当您以管理员身份从映射驱动器运行快捷方式时,它将以UNC路径启动批处理文件。

我使用这种批处理文件从网络映射驱动器运行命令或其他批处理文件

@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

是否可以使用UNC路径而不是映射的驱动器号?或者在运行batch#2之前提升并映射所需的驱动器?我不明白为什么只有这一次更新需要管理员权限。您可能还希望使用
psexec
进行调查,而不必将桌面远程连接到每台计算机并手动启动更新。驱动器由安全令牌映射。管理员有两个(正常和提升)。您需要映射为管理员才能为管理员映射驱动器。然而,映射驱动器是一个古老的兼容性问题。只需使用UNC
\\server\sharename\folder\file.ext
。另请参见
wmic/node:computerlist.txt进程调用create“c:\someprogram.exe”
@HarryJohnston&laoke-我不希望通过UNC路径访问,因为我必须在许多机器上执行此操作,并且已经将该目录映射为登录的一部分,这才是有用的(可能我误解了您的问题?)。我要做的是单独登录到每台电脑,导航到并运行此脚本,我真的不希望每次都通过UNC导航。在旁注中-我如何将驱动器映射为管理员,特别是在我当前的情况下(运行通过映射驱动器访问的脚本-导航到“I:\updates”而不是“\\server\sharename\folder\updates”以运行batch2.bat)?这就是我要找的,谢谢James。这允许使用快捷方式以管理员身份运行,窗口不会立即关闭,因为我使用的是驱动器号。