我有一个 Windows 批处理脚本,它将 EXE 或批处理文件复制到远程文件共享并使用 PowerShell WinRM 在远程服务器上运行它。远程运行命令的行如下所示:
ECHO Invoke-Command -Authentication CredSSP -Credential %USERDOMAIN%\%USERNAME% -ComputerName %SERVER_NAME% -ScriptBlock { cd (gwmi Win32_Share -Filter "name='%SHARE_NAME%'").Path ; .\%MY_EXE_TO_RUN% } |PowerShell.exe -Command -
我需要将当前目录更改为要运行的 EXE/批处理文件所在的文件共享目录(它依赖于此)。它也必须是一个本地目录 - 如果我尝试CD \\%SERVER_NAME%\%SHARE_NAME%
这适用于 EXE,但对于批处理文件失败,则 cmd.exe 不支持将 UNC 路径作为当前目录。但是,我也不想在脚本中硬编码共享的本地路径,所以我尝试在 WMI 中查找它。
这对管理员来说很好,但对于非管理员来说会失败,并出现访问被拒绝错误。这些非管理员用户可以 RDP 到服务器,打开 PowerShell 并在gwmi Win32_Share
那里成功运行。因此,通过 WinRM 运行时,权限检查似乎有所不同!
我发现http://www.adilhindistan.com/2013/10/permissions-to-access-wmi-remotely.html但在许多服务器上执行起来似乎相当复杂。除此之外,我不需要远程 WMI 访问。也许还有另一种方法可以解决共享的本地路径?或者,或者,我可以以某种方式运行 WMI 查询并对其应用本地权限检查吗?毕竟,我已经是远程服务器上的代码,所以应该有一些方法可以做到这一点。
我只能给出一个提示,因为提供的代码片段在我看来有点不清楚。
尽管
cmd
不支持UNC名称作为当前目录,但您仍然可以通过pushd
命令使用临时驱动器映射,前提是启用了命令扩展:不要忘记通过应用
popd
命令删除临时驱动器映射:有关命令扩展的更多信息,另请参阅
cmd /?
和SETLOCAL。更新:
Powershell
支持UNC名称作为当前目录: