我们在服务器上有一个 cmd 脚本,我们可以通过 UNC 路径访问它,例如\\machine\some_path\x.cmd
。 (具体来说,它是定制的 cygwin 安装的包装器,目的是在所有客户端上进行相同的安装。安装目标需要管理员权限。)
它已经按预期为许多用户工作,但今天在一台机器上尝试了几次都失败了(即使存在先决条件,例如目标文件夹)。这是在远程会话期间发生的,我无法立即复制,这就是我在这里问的原因:事后我们才意识到我们可能与其他用户的启动方式不同。
步骤 1:以管理员身份打开控制台并执行\\machine\some_path\x.cmd
。此方法在过去是有效的。
步骤 1:打开资源管理器,切换到\\machine\some_path
,然后右键单击x.cmd
。选择“以管理员身份运行”。控制台打开,安装开始,然后失败,无法创建文件。
这些错误显然可能是权限问题,但我发现这很令人惊讶:我以管理员身份启动了“根进程”,并希望子进程继承该权限。难道不是这样吗?
答案1
是的,有差异,但是差异非常小。
当您在以管理员身份运行的 cmd 中输入脚本名称时,脚本完成后 cmd 窗口将保持活动状态,而当您右键单击脚本并选择以管理员身份运行时,将以管理员身份启动新的 cmd,执行脚本,并在脚本结束时关闭 cmd 窗口。
其余的一切都是一样的。
由于 cmd 窗口在脚本启动之前已打开,因此在执行脚本之前对该 cmd 窗口所做的任何更改(例如建立网络连接、设置环境变量等)当然都可用于脚本。但如果您首先以管理员身份启动 cmd 窗口,然后直接运行脚本,则本答案的第一段完全就是所发生的情况。
这里还有一件事。当您从 UNC 路径启动 cmd 文件时,cmd 窗口将声明它不支持从 UNC 路径启动文件,并默认为 c:\windows\system32 并尝试从那里运行脚本。这可能会导致无法找到文件等行为。
原因是 cmd 无法在 UNC 路径上启动,但它可以通过临时创建网络驱动器在启动后启动程序(使用了 PUSHD 和 POPD 命令但不向用户显示)