以網域使用者身分從 Windows 7 中的服務執行 BAT 文件

以網域使用者身分從 Windows 7 中的服務執行 BAT 文件

首先是一些基礎知識:

  • 我正在運行一個作為服務 ServiceA 運行的資料庫伺服器應用程式。
  • ServiceA安裝在Server1和Server2上
  • ServiceA在任意時刻僅在兩台伺服器中的一台上運行(它們是冗餘伺服器,如果一台伺服器發生故障,另一台伺服器上的ServiceA自動啟動)
  • 我無法控製程式碼 ServiceA
  • ServiceA 以本機系統帳號登入
  • ServiceB需要同時在Server1和Server2上執行
  • ServiceB 以本機系統帳號登入
  • 我可以在 ServiceA 資料庫中建立配置物件。一種類型的物件就像 ServiceA 執行的腳本語言
  • 腳本語言具有允許在本機系統上進行檔案操作和執行命令的函數 - OPEN_FILE()、WRITE_FILE()、CLOSE_FILE() 和 SYSTEM()
  • 執行這些命令時,它們使用本機系統帳戶的憑證運行
  • ServiceA使用上述檔案操作指令為ServiceB產生設定檔
  • 在建立新的設定檔之前需要關閉ServiceB(我實際上在臨時資料夾中建立它們,關閉ServiceB,複製文件,然後啟動ServiceB)
  • Server1 和 Server2 都是 Windows 7 企業版
  • Server1和Server2都在同一個網域中

我試著讓 ServiceA :

  • 關閉 Server1 和 Server2 上的 ServiceB
  • 將一些檔案複製到Server1和Server2
  • 在Server1和Server2上啟動ServiceB

我做了什麼:

  • 使用密碼 (PasswordZ) 建立網域帳戶 (DomainX/UserY)
  • 在兩台伺服器上建立共用 (ShareW)
  • 授予 DomainX/UserY 存取兩台伺服器上 ShareW 的權限
  • 使用 OPEN_FILE()、WRITE_FILE() 和 CLOSE_FILE() 建立 INSTALL.BAT 文件
  • 使用 SYSTEM('C:\Temp\INSTALL.BAT >> C:\Temp\INSTALL.LOG 2>&1') 執行 INSTALL.BAT(由服務 A 作為本機系統執行)並建立偵錯日誌

BAT 檔案中的內容

NET USE \\Server1\ShareW PasswordZ /USER:DomainX/UserY
NET USE \\Server2\ShareW PasswordZ /USER:DomainX/UserY
DEL /F /Q "\\Server1\ShareW\*.*
DEL /F /Q "\\Server2\ShareW\*.*
XCOPY /Y "C:\Temp\*.*" "\\Server1\ShareW\"
XCOPY /Y "C:\Temp\*.*" "\\Server2\ShareW\"
NET USE \\Server1\ShareW /DELETE
NET USE \\Server2\ShareW /DELETE

所以共享和權限設定正確

我的問題是嘗試從 INSTALL.BAT 中停止和啟動服務 B

我努力了:

NET USE \\Server1\IPC$ PasswordZ /USER:DomainX/UserY
SC \\Server1 STOP "Service B"
NET USE \\Server1\IPC$ /DELETE
NET USE \\Server2\IPC$ PasswordZ /USER:DomainX/UserY
SC \\Server2 STOP "Service B"
NET USE \\Server2\IPC$ /DELETE

SC 指令適用於本機,但不適用於遠端電腦。這是在 Server2 上運行的 INSTALL.BAT 的輸出:

C:\Windows\system32>NET USE \\Server1\IPC$ PasswordZ /USER:DomainX/UserY 
The command completed successfully.

C:\Windows\system32>SC \\Server1 STOP ServiceB 
[SC] OpenService FAILED 5:

Access is denied.

(我嘗試在 Server1 和 Server2 上執行 ServiceA - 相同的結果 - 本機工作,遠端失敗)

如果我使用「以不同使用者身分執行」以 DomainX/UserY 身分執行 CMD.EXE,則 SC 命令可以完美運行。因此,在 Server2 上,從 CMD.EXE 作為 DomainX/UserY 運行 INSTALL.BAT,我得到:

C:\Temp>NET USE \\Server1\IPC$ PasswordZ /USER:DomainX/UserY

The command completed successfully.
C:\Temp>SC \\Server1 START ServiceB

SERVICE_NAME: ServiceB
        TYPE               : 110  WIN32_OWN_PROCESS  (interactive)
        STATE              : 2  START_PENDING
                                (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x1
        WAIT_HINT          : 0xbb8
        PID                : 4856
        FLAGS              :

因此,DomainX/UserY 具有在遠端伺服器上停止和啟動服務的必要權限。這似乎是對本機系統帳戶權限升級的某種阻止。

我已閱讀有關將 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\ 中的 LocalAccountTokenFilterPolicy 設為 1 並重新啟動的資訊。我已經這麼做了,結果沒有改變。

我嘗試使用 psservice.exe 得到幾乎相同的結果(來自 Server2 上 ServiceA 運行的 INSTALL.BAT 的輸出)

C:\Windows\system32>C:\Utilities\psservice.exe \\Server1 -u DomainX/UserY -p PasswordZ -accepteula stop ServiceB 

PsService v2.24 - Service information and configuration utility
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com

Access is denied.
Access is denied.
Error querying services on Server1:
Error opening ServiceB on Server1:

然後我嘗試使用 psexec (以相當複雜的方式捕獲所有日誌記錄)

安裝2.BAT

C:\Utilities\psexec -accepteula -u DomainX/UserY -p PasswordZ C:\Temp\INSTALL3.BAT >> C:\Temp\INSTALL3.LOG 2>&1

安裝3.BAT

C:\Temp\INSTALL.BAT >> C:\Temp\INSTALL.LOG 2>&1

當我從命令列運行 INSTALL2.BAT(以 DomainX/UserY 身份運行)時,一切正常。

但是從 ServiceA 運行,在 INSTALL3.LOG 中我得到:

PsExec v2.11 - Execute processes remotely
Copyright (C) 2001-2014 Mark Russinovich
Sysinternals - www.sysinternals.com

Access is denied.

PsExec could not start C:\Temp\INSTALL3.BAT:

因此,我明確地將具有完全控制功能的 DomainX/UserY 添加到所有三個 BAT 檔案的安全性中。結果是相同的(存取被拒絕。在 INSTALL3.LOG 中)

我也嘗試關閉 UAC,但沒有任何明顯影響

所以我現在幾乎陷入困境 - 如何獲取由作為本地系統運行的服務執行的 BAT 文件來模擬另一個用戶並允許其在遠端電腦上停止和啟動服務?

答案1

答案非常簡單 - 使用 psexec 的 -h 選項

ServiceA 運行的腳本的 SYSTEM() 命令現在是:

C:\Utilities\psexec -accepteula -h -u DomainX/UserY -p PasswordZ C:\Temp\INSTALL.BAT >> C:\Temp\INSTALL.LOG 2>&1

完美運作

相關內容