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 Enterprise입니다.
  • Server1과 Server2는 모두 동일한 도메인에 있습니다.

ServiceA를 다음과 같이 하려고 합니다.

  • Server1과 Server2 모두에서 ServiceB 종료
  • 일부 파일을 Server1 및 Server2에 복사
  • Server1과 Server2 모두에서 ServiceB 시작

내가 뭘 한거지:

  • 비밀번호(PasswordZ)를 사용하여 도메인 계정(DomainX/UserY)을 만들었습니다.
  • 두 서버 모두에 공유를 생성했습니다(ShareW).
  • 두 서버 모두에서 ShareW에 액세스할 수 있는 DomainX/UserY 권한이 부여되었습니다.
  • 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를 실행해 보았습니다. 동일한 결과가 로컬에서 작동하고 원격으로 실패합니다.)

CMD.EXE를 DomainX/UserY로 실행하기 위해 '다른 사용자로 실행'을 사용하면 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

명령줄(DomainX/UserY로 실행)에서 INSTALL2.BAT를 실행하면 모든 것이 잘 작동합니다.

그러나 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:

그래서 세 가지 BAT 파일 모두의 보안에 모든 권한이 있는 DomainX/UserY를 명시적으로 추가했습니다. 결과는 동일했습니다. (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

완벽하게 작동

관련 정보