通过WinRM远程运行PowerShell脚本时获取Windows文件共享的本地path

我有一个Windows批处理脚本,将EXE或batch file复制到远程文件共享,并使用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 /batch file所在的文件共享目录(它依赖于此目录)。 它也必须是一个本地目录 – 如果我尝试使用CD \\%SERVER_NAME%\%SHARE_NAME%这可以用于EXE,但是对于batch file将失败,cmd.exe不支持将UNCpath作为当前目录。 但是,我也不想在脚本中硬编码共享的本地path,所以我试图在WMI中查找它。

这对pipe理员工作正常,但对于拒绝访问错误的非pipe理员失败。 这些非pipe理员用户可以将RDP发送到服务器,打开PowerShell并在那里成功运行gwmi Win32_Share 。 因此,通过WinRM运行时,权限检查似乎有点不同!

我发现http://www.adilhindistan.com/2013/10/permissions-to-access-wmi-remotely.html,但在许多服务器上看起来相当复杂。 除此之外,我不需要远程WMI访问。 也许还有另一种方式来解决这个份额的本地path? 或者,也可以以某种方式运行WMI查询并对其应用本地权限检查? 毕竟,我已经在远程服务器上的代码,所以应该有一些方法来做到这一点。

我只能给出一个提示,因为提供的代码片段对我来说略显不清。

尽pipecmd不支持UNC名称作为当前目录,但仍然可以通过pushd命令使用临时驱动器映射,前提是命令扩展已启用:

PUSHD :指定UNCpath时, PUSHD将创build一个临时驱动器映射,然后使用该新驱动器。
临时驱动器字母按字母顺序反向分配,所以如果Z:空闲,它将被首先使用。

 pushd \\%SERVER_NAME%\%SHARE_NAME% 

不要忘记通过应用popd命令删除临时驱动器映射:

POPD :将目录切换回最近由PUSHD命令存储的path/文件夹。 POPD还将删除由PUSHD创build的任何临时驱动器映射。

另见cmd /? 和SETLOCAL以获取有关命令扩展的更多信息。

更新Powershell支持UNC名称作为当前目录:

 Push-Location \\$env:SERVER_NAME\$env:SHARE_NAME\$env:MY_SUBDIR_UNDER_SHARE