суть такова: из программы на с++ (служба 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 устанавливать все возможные привилегии
хелп.
Служба windows - это не windows-приложение. Главное отличие - у него нет окна приложения. Боюсь, скрипту нужно окно, чтобы нормально работать.
Zab
Скрипт выполняется в рамках процесса cscript.exe. Причём здесь сервис и окно.
cranky
Так у тебя интерпретатор не запускается или скрипт не выполняется? Посмотри что возвращает CreateProcess.
ох, действительно все оказалось просто - неправильно вычислил путь к папке со скриптами facepalm.jpg
другая беда >_<
создал свой инпроцесс сервер с тем, чтобы использовать самопальные компоненты в .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
нашел решение тут
решилось реализацией методов интерфейса IDispatch
http://msdn.microsoft.com/en-us/library/ms221186.aspx
Тема в архиве.