我有一个 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 查询并对其应用本地权限检查?毕竟,我已经在远程服务器上编写代码了,所以应该有办法做到这一点。
答案1
我只能给出一个提示,因为提供的代码片段对我来说似乎有点不清楚。
虽然cmd
不支持北卡罗来纳大学名称为当前目录你仍然可以通过使用临时驱动器映射pushd
命令提供了命令扩展已启用:
推高清: 当一个北卡罗来纳大学指定路径后,
PUSHD
将创建一个临时驱动器映射,然后使用该新驱动器。
临时驱动器号按字母倒序分配,因此如果Z:
有空闲,将首先使用它。
pushd \\%SERVER_NAME%\%SHARE_NAME%
不要忘记通过应用删除临时驱动器映射popd
命令:
慢性阻塞性肺疾病:将目录更改回该命令最近存储的路径/文件夹
PUSHD
。POPD
还将删除由创建的任何临时驱动器映射PUSHD
。
另请cmd /?
参阅设置本地更多信息命令扩展。
更新:Powershell
支持北卡罗来纳大学名称为当前目录:
Push-Location \\$env:SERVER_NAME\$env:SHARE_NAME\$env:MY_SUBDIR_UNDER_SHARE