Powershell

通過 WinRM 遠端執行 PowerShell 腳本時獲取 Windows 文件共享的本地路徑

  • October 27, 2016

我有一個 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命令使用臨時驅動器映射,前提是啟用了命令擴展:

PUSHD:指定UNC路徑時,PUSHD將創建一個臨時驅動器映射,然後使用該新驅動器。
臨時驅動器號按字母倒序分配,因此如果Z:空閒,它將首先使用。

pushd \\%SERVER_NAME%\%SHARE_NAME%

不要忘記通過應用popd命令刪除臨時驅動器映射:

POPDPUSHD :將目錄更改回該命令最近儲存的路徑/文件夾。POPD還將刪除由PUSHD.

有關命令擴展的更多資訊,另請參閱cmd /?SETLOCAL

更新Powershell支持UNC名稱作為目前目錄:

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

引用自:https://serverfault.com/questions/811471