ПрограммированиеФорумОбщее

CreateProcess из службы windows?

#0
15:04, 17 июня 2011

суть такова: из программы на с++ (служба windows) назо запустить .vbs скрипт таким образом, чтобы этот скрипт обладал всеми необходимыми правами и привилегиями для создания/удаления файлов.

код:

void task_manager::execute(const std::string &script)
{
  STARTUPINFO startup_info;
  memset(&startup_info, 0, sizeof(startup_info));
  startup_info.cb = sizeof(startup_info);

  PROCESS_INFORMATION process_info;
  memset(&process_info, 0, sizeof(process_info));
  
  std::string command = std::string("cscript.exe /nologo ") + get_root_dir() + std::string("\\plugins\\") + script;
  char *p = const_cast<char*>(command.c_str());
  CreateProcess(NULL, p, &m_sa, 0, FALSE,
    0, 0, 0, &startup_info, &process_info);
}

если запускать блокнот, то в диспетчере задач появляется экземпляр notepad.exe запущенный под SYSTEM, а вот скрипт выполняться не хочет.

уже пробовал:
1 создавать SECURITY_DESCRIPTOR с правами администратора
2 запускать от имени пользователя с правами админа, при помощи LogonUser() и CreateProcessAsUser()
3 устанавливать все возможные привилегии

хелп.

#1
15:11, 17 июня 2011

Служба windows - это не windows-приложение. Главное отличие - у него нет окна приложения. Боюсь, скрипту нужно окно, чтобы нормально работать.

#2
16:02, 17 июня 2011

Zab
Скрипт выполняется в рамках процесса cscript.exe. Причём здесь сервис и окно.

cranky
Так у тебя интерпретатор не запускается или скрипт не выполняется? Посмотри что возвращает CreateProcess.

#3
18:19, 17 июня 2011

ох, действительно все оказалось просто - неправильно вычислил путь к папке со скриптами facepalm.jpg

#4
20:22, 27 июня 2011

другая беда >_<
создал свой инпроцесс сервер с тем, чтобы использовать самопальные компоненты в .vbs скриптах. и вроде бы все ок, но при запуске скрипта в котором происходит вызов метода моего компонента появляется оно

побегал отладчиком по коду, присоединившись к cscript.exe - все вроде бы ок, фабрика класса создается, затем инстанцируется экземпляр класса, и на этом все...

записи в реестре после выполнения DllRegisterServer():

HKEY_CLASSES_ROOT\CLSID

[HKEY_CLASSES_ROOT\CLSID\{8A64B9CC-43E8-42EE-B380-E4D95D5C5579}]
@="XcFtp Class"

[HKEY_CLASSES_ROOT\CLSID\{8A64B9CC-43E8-42EE-B380-E4D95D5C5579}\InprocServer32]
@="C:\\Users\\Иван\\Documents\\Visual Studio 2005\\Projects\\xcommit\\x64\\release\\inproc.dll"

[HKEY_CLASSES_ROOT\CLSID\{8A64B9CC-43E8-42EE-B380-E4D95D5C5579}\ProgID]
@="XCommit.XcFtp"

[HKEY_CLASSES_ROOT\CLSID\{8A64B9CC-43E8-42EE-B380-E4D95D5C5579}\TypeLib]
@="{5705C9AE-FD6A-43FC-8218-7629F9DBA052}"

[HKEY_CLASSES_ROOT\CLSID\{8A64B9CC-43E8-42EE-B380-E4D95D5C5579}\Version]
@="1.0"

HKEY_CLASSES_ROOT

[HKEY_CLASSES_ROOT\XCommit.XcFtp]
@="XcFtp Class"

[HKEY_CLASSES_ROOT\XCommit.XcFtp\CLSID]
@="{8A64B9CC-43E8-42EE-B380-E4D95D5C5579}"

HKEY_CLASSES_ROOT\TypeLib

[HKEY_CLASSES_ROOT\TypeLib\{5705C9AE-FD6A-43FC-8218-7629F9DBA052}]
@=""

[HKEY_CLASSES_ROOT\TypeLib\{5705C9AE-FD6A-43FC-8218-7629F9DBA052}\1.0]
@=""

[HKEY_CLASSES_ROOT\TypeLib\{5705C9AE-FD6A-43FC-8218-7629F9DBA052}\1.0\0]
@=""

[HKEY_CLASSES_ROOT\TypeLib\{5705C9AE-FD6A-43FC-8218-7629F9DBA052}\1.0\0\win64]
@="C:\\Users\\Иван\\Documents\\Visual Studio 2005\\Projects\\xcommit\\x64\\release\\inproc.dll"

[HKEY_CLASSES_ROOT\TypeLib\{5705C9AE-FD6A-43FC-8218-7629F9DBA052}\1.0\FLAGS]
@="0"

ЧЯДНТ? wall.jpg

#5
23:02, 29 июня 2011

нашел решение тут

решилось реализацией методов интерфейса IDispatch
http://msdn.microsoft.com/en-us/library/ms221186.aspx

ПрограммированиеФорумОбщее

Тема в архиве.