2

Сначала несколько основ:

  • Я запускаю приложение сервера базы данных, которое работает как сервис ServiceA.
  • ServiceA установлен на Сервер1 и Сервер2
  • ServiceA работает только на одном из двух серверов одновременно (это резервные серверы, в случае сбоя одного сервера автоматически запускается ServiceA на другом сервере)
  • У меня нет контроля над кодом ServiceA
  • ServiceA входит в систему как учетная запись локальной системы
  • ServiceB должен работать как на Server1, так и на Server2
  • ServiceB входит в систему как локальная системная учетная запись
  • Я могу создавать объекты конфигурации в базе данных ServiceA. Один тип объекта похож на язык сценариев, который выполняет ServiceA
  • Язык сценариев имеет функции, позволяющие манипулировать файлами и выполнять команды в локальной системе - OPEN_FILE (), WRITE_FILE (), CLOSE_FILE () и SYSTEM ()
  • Когда эти команды выполняются, они запускаются с учетными данными учетной записи локальной системы
  • ServiceA генерирует файлы конфигурации для ServiceB, используя вышеупомянутые команды манипулирования файлами
  • ServiceB необходимо отключить перед созданием новых файлов конфигурации (я фактически создаю их во временной папке, выключаю ServiceB, копирую файлы и затем запускаю ServiceB)
  • Сервер1 и Сервер2 оба Windows 7 Корпоративная
  • Сервер1 и Сервер2 находятся в одном домене

Я пытаюсь заставить ServiceA:

  • Завершение работы службыB на сервере Server1 и сервере2
  • Скопируйте некоторые файлы на сервер1 и сервер2
  • Запустите ServiceB как на Сервере1, так и на Сервере2

Что я сделал:

  • Создана учетная запись домена (DomainX/UserY) с паролем (PasswordZ)
  • Создал общий ресурс на обоих серверах (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

Таким образом, общий ресурс и разрешения настроены правильно

Моя проблема пытается остановить и запустить службу B из INSTALL.BAT

Я пытался:

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 работает для локальной машины, но не работает для удаленной машины. Это выходные данные INSTALL.BAT, работающие на Server2:

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.

(Я пробовал с ServiceA, работающим на Server1 и Server2 - те же результаты - Работает локально, дает сбой удаленно)

Если я использую «Запуск от имени другого пользователя» для запуска CMD.EXE от имени DomainX/UserY, команда SC работает отлично. Итак, на сервере Server2, запустив INSTALL.BAT из CMD.EXE под именем DomainX/UserY, я получаю:

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 имеет необходимые разрешения для остановки и запуска службы на удаленном сервере. Похоже, это какая-то блокировка повышения привилегий из учетной записи локальной системы.

Я прочитал об установке LocalAccountTokenFilterPolicy в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\ на 1 и перезагрузке. Я сделал это без изменений в результате.

Я попытался использовать psservice.exe с практически идентичными результатами (вывод из INSTALL.BAT, запущенного ServiceA на Server2)

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 (довольно запутанно, чтобы перехватить все логи)

INSTALL2.ЛЕТУЧАЯ МЫШЬ

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

INSTALL3.ЛЕТУЧАЯ МЫШЬ

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.ЖУРНАЛ)

Я также попытался отключить UAC без ощутимого воздействия

Так что я в значительной степени застрял сейчас - как я могу получить BAT-файл, выполняемый службой, работающей в качестве локальной системы, чтобы выдать себя за другого пользователя и позволить ему останавливать и запускать службы на удаленной машине?

1 ответ1

0

Ответ оказывается очень простым - используйте опцию -h в psexec

Команда SYSTEM() скрипта, запущенного ServiceA, теперь:

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

Работает отлично

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .