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

Posted

技术标签:

【中文标题】批处理:从映射的网络驱动器以管理员身份运行【英文标题】:Batch: run as administrator from mapped network drive 【发布时间】:2016-09-24 18:55:44 【问题描述】:

所以,我遇到了每个人似乎都试图以管理员身份运行存储在网络驱动器上的批处理文件的常见问题。我已经搜索了互联网,并且有一些“解决方法”,但如果可以的话,我不确定如何应用它们。

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

在这个特定的实例中,批次 #1 运行闪存的静默安装。之后,它需要将配置文件复制到上述受保护的文件夹以禁用其自动更新功能,因为我们的标准用户无法运行更新,否则闪存会唠叨他们(为什么 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"
:--------------------------------------

【问题讨论】:

您可以使用 UNC 路径而不是映射的驱动器号吗?或者提升和映射所需的驱动器之前运行批次#2?我很困惑为什么只有这个更新需要管理员权限。您可能还想使用psexec 进行调查,而不必将远程桌面连接到每台计算机并手动启动更新。 驱动器由安全令牌映射。管理员有两个(普通和提升)。您需要以管理员身份进行映射才能为管理员提供映射驱动器。然而,映射驱动器是一个古老的兼容性问题。只需使用 UNC \\server\sharename\folder\file.ext。另见wmic /node:computerlist.txt process call create "c:\someprogram.exe" @HarryJohnston & Noodles - 我不希望通过 UNC 路径访问,因为我必须在很多机器上执行此操作,并且已经将该目录映射为登录的一部分,这使得这很有用(也许我误解了你的问题?)。我正在做的是单独登录每台电脑,导航到并运行此脚本,并且真的不想每次都通过 UNC 导航。附带说明 - 我如何以管理员身份映射驱动器,尤其是。根据我目前的情况(通过映射驱动器访问的运行脚本 - 导航到“I:\updates”而不是“\\server\sharename\folder\updates”来运行 batch2.bat)? 【参考方案1】:

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

【讨论】:

这就是我想要的,谢谢詹姆斯。这允许使用快捷方式以管理员身份运行,并且窗口不会立即关闭,因为我使用的是驱动器号。【参考方案2】:

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

@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

【讨论】:

以上是关于批处理:从映射的网络驱动器以管理员身份运行的主要内容,如果未能解决你的问题,请参考以下文章

怎么映射网络驱动器

如何映射网络驱动器

映射要由服务使用的网络驱动器

映射要由服务使用的网络驱动器

XP无法访问映射网络驱动器

由于找不到网络 未能映射驱动器