Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> wmi + c++ приложение удаленно не стартует, wmi + c++ 
:(
    Опции темы
gutalin69
Дата 23.4.2014, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 15.4.2014

Репутация: нет
Всего: нет



подскажите пожалуйста  в чем может быть причина, приложение удаленно не стартует,  (очень срочно)

Код

HRESULT hres;
...
 
BSTR MethodName = SysAllocString(L"Create")
BSTR ClassName3 = SysAllocString(L"Win32_ScheduledJob");
IWbemClassObject* pClass = NULL;
hres = pSvc->GetObject(ClassName3, 0, NULL, &pClass, NULL);
IWbemClassObject* pInParamsDefinition = NULL;
hres = pClass->GetMethod(MethodName, 0,&pInParamsDefinition, NULL);
 
IWbemClassObject* pClassInstance = NULL;
hres = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
 
VARIANT vtProp2;
                vtProp2.vt = VT_BSTR;
                vtProp2.bstrVal =L"calc.exe";
 
                VARIANT vtProp3;
                vtProp3.vt = VT_BSTR;
                vtProp3.bstrVal =  L"********012500.000000 - 420";//заменить на текущее
 
 
                VARIANT vtProp4;
                vtProp4.vt = VT_BOOL;
                vtProp4.boolVal = true;//запускать сразу
 
                VARIANT vtProp5;
                vtProp5.vt = VT_INT;
                vtProp5.intVal=2;//день в неделе
 
                VARIANT vtProp6;
                vtProp6.vt = VT_INT;
                vtProp6.intVal = NULL;//день в году
 
                VARIANT vtProp7;
                vtProp7.vt = VT_BOOL;
                vtProp7.boolVal = true;//отобр на столе
 
                UINT32 jobId;
 
hres = pClassInstance->Put(L"Command", 0, &vtProp2, 0);
hres = pClassInstance->Put(L"StartTime", 0, &vtProp3, 0);
hres = pClassInstance->Put(L"RunRepeatedly", 0, &vtProp4, 0);
hres = pClassInstance->Put(L"DaysOfWeek", 0, &vtProp5, 0);
hres = pClassInstance->Put(L"DaysOfMounth", 0, &vtProp6, 0);
hres = pClassInstance->Put(L"InteractWithDesktop", 0, &vtProp7, 0);
IWbemClassObject* pOutParams = NULL;
 
                    hres = pSvc->ExecMethod(ClassName3, MethodName, 0,
                
                     NULL, pClassInstance, &pOutParams, NULL);
    if (FAILED(hres))
 
            {
 
                cout << "Could not execute method. Error code = 0x"
 
                    << hex << hres << endl;
 
                     VariantClear(&varCommand);
 
                        SysFreeString(ClassName);
 
               SysFreeString(MethodName);
 
                pClass->Release();
 
                pInParamsDefinition->Release();
 
                pOutParams->Release();
 
                pSvc->Release();
 
                pLoc->Release();
                
                CoUninitialize();
 
                return 1;               // Program has failed.
 
            }

PM MAIL   Вверх
xvr
Дата 23.4.2014, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



  • Проверьте все hres, а не только последнее
  • Создается ли задание на удаленном компьютере?
  • Настроенна ли имперсонализация?
  • Использовать Win32_ScheduledJob для запуска не комильфо, лучше взять Win32_Process
  • В любом случае настройки безопасности Windows могут не позволить что либо запустить (а могут и позволить, но на невидимом Desktop'е)

Код

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set objStartup = objWMIService.Get("Win32_ProcessStartup")
Set objConfig = objStartup.SpawnInstance_
Set objProcess = GetObject("winmgmts:root\cimv2:Win32_Process")
errReturn = objProcess.Create( "Notepad.exe", null, objConfig, intProcessID)

На С++ сами перепишете  smile 
PM MAIL   Вверх
gutalin69
Дата 23.4.2014, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 15.4.2014

Репутация: нет
Всего: нет



на msdn написано что удаленный процесс при помощи win32Process и win32ProcessStartup не может быть запущен интерактивно, т.е подразумевается ,наверное, что его окошка мы не увидим 
Вот старый код, запускает только процесс, на локальном разворачивает на весь экран, только не понятно ProcessStartupInformation  что за свойство
Код

            BSTR MethodName = SysAllocString(L"Create");
            BSTR ClassName = SysAllocString(L"Win32_Process");
            BSTR ClassName2 = SysAllocString(L"Win32_ProcessStartup");
            BSTR ClassName3 = SysAllocString(L"Win32_ScheduledJob");
            hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);
            IWbemClassObject* pInParamsDefinition = NULL;
            hres = pClass->GetMethod(MethodName, 0,
                &pInParamsDefinition, NULL);
            IWbemClassObject* pClassInstance = NULL;
            //hres = pInParamsDefinition->GetNames()
            hres = pInParamsDefinition->SpawnInstance(0, &pClassInstance);
            hres = pClassInstance->Put(L"CommandLine", 0,&varCommand, 0);
 wprintf(L"The command is: %s\n", V_BSTR(&varCommand));
IWbemClassObject* pClass2 = NULL;
            hres = pSvc->GetObject(ClassName2, 0, NULL, &pClass2, NULL);
            IWbemClassObject* pClassInstance2 = NULL;
            hres = pClass2->SpawnInstance(0, &pClassInstance2);


            
            VARIANT varCommand_WinstationDesktop;
            varCommand_WinstationDesktop.vt = VT_BSTR;
             varCommand_WinstationDesktop.bstrVal = L"ABC";
            hres = pClassInstance2->Put(L"WinstationDesktop",0,&varCommand_WinstationDesktop ,0);


            VARIANT varCommand2;
            varCommand2.vt =VT_UI1;
            varCommand2.bVal =SW_SHOWMAXIMIZED;


hres = pClassInstance2->Put(L"ShowWindow", 0,&varCommand2, 0);
            

            VARIANT varCommand_ProcessStartup;
            varCommand_ProcessStartup.vt = VT_UNKNOWN;
            varCommand_ProcessStartup.punkVal = pClassInstance2;

            hres = pClassInstance->Put(L"ProcessStartupInformation",0, &varCommand_ProcessStartup,0);
            IWbemClassObject* pOutParams2 = NULL;
IWbemClassObject* pOutParams = NULL;
                
            
                hres = pSvc->ExecMethod(ClassName, MethodName, 0,

                    NULL, pClassInstance, &pOutParams, NULL);
                if (FAILED(hres))

            {

                cout << "Could not execute method. Error code = 0x"

                    << hex << hres << endl;

                     VariantClear(&varCommand);

                        SysFreeString(ClassName);

               SysFreeString(MethodName);

                pClass->Release();

                pInParamsDefinition->Release();

                pOutParams->Release();

                pSvc->Release();

                pLoc->Release();
                
                CoUninitialize();

                return 1;               // Program has failed.

            }

                   VARIANT varReturnValue;
            hres = pOutParams->Get(_bstr_t(L"ReturnValue"), 0,
               &varReturnValue, NULL, 0);

                

Это сообщение отредактировал(а) gutalin69 - 23.4.2014, 13:58
PM MAIL   Вверх
gutalin69
Дата 23.4.2014, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 15.4.2014

Репутация: нет
Всего: нет



приложение удаленно стартует , но  надо включить службу обнаружения задач и  перезапустить процесс в process explorer'e ,чтобы вышло окно, что это еще за костыль такой? и если только так , то как можно удаленно перезапустить процесс в с ++?

Это сообщение отредактировал(а) gutalin69 - 24.4.2014, 07:13
PM MAIL   Вверх
xvr
Дата 24.4.2014, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(gutalin69 @  23.4.2014,  13:54 Найти цитируемый пост)
            VARIANT varCommand_WinstationDesktop;
            varCommand_WinstationDesktop.vt = VT_BSTR;
             varCommand_WinstationDesktop.bstrVal = L"ABC";
            hres = pClassInstance2->Put(L"WinstationDesktop",0,&varCommand_WinstationDesktop ,0);

Вот это создаст вам новую неинтерактивную WinStation и Desktop, соответственно вы ничего не увидите.
Задайте "WinSta0\Default" вместо "ABC" (хотя это еще ничего не гарантирует - Windows может вас и не пустить к Desktop'у)

Цитата(gutalin69 @  23.4.2014,  13:54 Найти цитируемый пост)
Вот старый код, запускает только процесс, на локальном разворачивает на весь экран, только не понятно ProcessStartupInformation  что за свойство

Туда нужно передать pClassInstance2

Цитата(gutalin69 @  23.4.2014,  13:54 Найти цитируемый пост)
на msdn написано что удаленный процесс при помощи win32Process и win32ProcessStartup не может быть запущен интерактивно, т.е подразумевается ,наверное, что его окошка мы не увидим 

Увы да, к Winstation его не пустят  smile 

Цитата(gutalin69 @  23.4.2014,  20:02 Найти цитируемый пост)
приложение удаленно стартует , но  надо включить службу обнаружения задач и  перезапустить процесс в process explorer'e ,чтобы вышло окно,

Это значит, что приложение так же запустилось не интерактивно - на невидимом WinStation & Desktop.

Цитата(gutalin69 @  23.4.2014,  20:02 Найти цитируемый пост)
и если только так , то как можно удаленно перезапустить процесс в с ++?

Ровно так же, как и запустить его заново, т.е. никак  smile 

Через Win32_ScheduledJob в теории тоже можно сделать, но и тут есть подводные камни (целых 2) -
Цитата

The Win32_ScheduledJob class is derived from CIM_Job. In Windows XP with Service Pack 1 (SP1) and Windows Server 2003, tasks started through Win32_ScheduledJob run under the NetworkServiceHost Account. You must be a member of the administrators group to create a scheduled job using this class.

The Win32_ScheduledJob class is internally using the AT protocol, which is bound to deprecation starting with Windows 8 and Windows Server 2012. As a first step the AT protocol is disabled by default. If the protocol is disabled, for example calling the Create method on a Win32_ScheduledJob object will fail with error 0x8. 

И еще надо не забыть задать проперть Owner, иначе система будет не в курсе, от имени кого запускать задачу (и на чьем Desktop'е она должна появиться)

Может есть другие способы решения вашей задачи? Вы не можете на удаленной машине установить свой сервис, например?


PM MAIL   Вверх
gutalin69
Дата 24.4.2014, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 15.4.2014

Репутация: нет
Всего: нет



спасибо,  а как в данном случае запустить задачу под нужным пользователем? у меня запускается от имени "SYSTEM", и так же вроде в настройках подключения если посмотреть код, указывается структура userAcct с учетными данными пользователя ,scheduled_job создается без всякой error 0x8 значит с протоколами все в порядке


остается еще утилита русиновича, но ее надо научить правильной кодировке, а то при ошибках выводит всякую дрянь

Это сообщение отредактировал(а) gutalin69 - 24.4.2014, 13:41
PM MAIL   Вверх
xvr
Дата 25.4.2014, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(gutalin69 @  24.4.2014,  10:31 Найти цитируемый пост)
спасибо,  а как в данном случае запустить задачу под нужным пользователем?

В Owner прописать пользователя. Вот только куда ему вводить пароль - я не в курсе  smile 
Цитата(gutalin69 @  24.4.2014,  10:31 Найти цитируемый пост)
у меня запускается от имени "SYSTEM",
У SYSTEM'а нет доступа к интерактивному Desktop'у, так что запустить что то видимое оттуда не получится


PM MAIL   Вверх
gutalin69
Дата 26.4.2014, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 15.4.2014

Репутация: нет
Всего: нет



дык в том-то и дело что owner' не выставляется, идет как система
 кто-нибудь делал на плюсах перехват значений с консоли PsiExec?


Код

BSTR MethodName = SysAllocString(L"Create");
BSTR ClassName3 = SysAllocString(L"Win32_ScheduledJob");
IWbemClassObject* pClass2 = NULL;
hres = pSvc->GetObject(ClassName3, 0, NULL, &pClass, NULL);
IWbemClassObject* pInParamsDefinition = NULL;
hres = pClass->GetMethod(MethodName, 0,    &pInParamsDefinition, NULL);
IWbemClassObject* pClassInstance = NULL;
hres = pClass->SpawnInstance(0, &pClassInstance);
IWbemClassObject* myclass;
VARIANT vtProp1;
            vtProp1.vt = VT_BSTR;
            vtProp1.bstrVal = L"Starting";
            hres = pClassInstance->Put(L"Status", 0, &vtProp1, 0);


            VARIANT vtProp777;
                vtProp777.vt = VT_BSTR;//-i -d -h 
                vtProp777.bstrVal = L"user";
                hres = pClassInstance->Put(L"Owner", 0, &vtProp777, 0);

            VARIANT vtProp2;
                vtProp2.vt = VT_BSTR;//-i -d -h 
                vtProp2.bstrVal = L"Unlocker.exe";
                hres = pClassInstance->Put(L"Command", 0, &vtProp2, 0);

VARIANT vtProp3;
vtProp3.vt = VT_BSTR;
vtProp3.bstrVal = L"********135200.000000+240";
hres = pClassInstance->Put(L"StartTime", 0,&vtProp3, 0);


                VARIANT vtProp0;
                vtProp0.vt =VT_UI1;
                vtProp0.bVal = 0x13;
                hres = pClassInstance->Put(L"Priority", 0,&vtProp0, 0);

                                VARIANT vtProp6;
                vtProp6.vt =VT_UI1;
                vtProp6.bVal = 0x2000000;
                hres = pClassInstance->Put(L"DaysOfMonth", 0, &vtProp6, 0);

                VARIANT vtProp4;
                vtProp4.vt = VT_BOOL;
                vtProp4.boolVal = true;
                hres = pClassInstance->Put(L"RunRepeatedly", 0, &vtProp4, 0);

                VARIANT vtProp5;
                vtProp5.vt =VT_UI1;
                vtProp5.bVal = 0x20;
                hres = pClassInstance->Put(L"DaysOfWeek", 0, &vtProp5, 0);


VARIANT vtProp7;
                vtProp7.vt = VT_BOOL;
                vtProp7.boolVal = true;//отобр на столе
                hres = pClassInstance->Put(L"InteractWithDesktop", 0, &vtProp7, 0);
    IWbemClassObject* pOutParams = NULL;
hres = pSvc->ExecMethod(ClassName3, MethodName, 0,

                    NULL, pClassInstance, &pOutParams, NULL);




Это сообщение отредактировал(а) gutalin69 - 26.4.2014, 14:06
PM MAIL   Вверх
xvr
Дата 26.4.2014, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(gutalin69 @  26.4.2014,  13:18 Найти цитируемый пост)
дык в том-то и дело что owner' не выставляется, идет как система

Мда, в MSDN все эти проперти указанны как R/O. Видимо не судьба  smile Win32_ScheduledJob использует протокол AT команды, попробуйте ее вручную - если не получится, то и с Win32_ScheduledJob разбираться смысла нет

PM MAIL   Вверх
gutalin69
Дата 26.4.2014, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 15.4.2014

Репутация: нет
Всего: нет



ну не все , есть еще вариант Psexec , а как правильно на плюсах перенаправить сообщения об ошибках  идущие из Psexec? использовать Pipe?
PM MAIL   Вверх
xvr
Дата 26.4.2014, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(gutalin69 @  26.4.2014,  14:09 Найти цитируемый пост)
есть еще вариант Psexec ,

Он требует немалых привилегий для работы. Если он у вас работает, то вам повезло  smile 
Цитата(gutalin69 @  26.4.2014,  14:09 Найти цитируемый пост)
а как правильно на плюсах перенаправить сообщения об ошибках  идущие из Psexec?

Так же, как и на С - popen

Если способ, которым работает psexec устраивает, то наверное можно его функциональность встроить и к себе  smile 
Цитата

 Inside PsExec

PsExec starts an executable on a remote system and controls the input and output streams of the executable's process so that you can interact with the executable from the local system. PsExec does so by extracting from its executable image an embedded Windows service named Psexesvc and copying it to the Admin$ share of the remote system. PsExec then uses the Windows Service Control Manager API, which has a remote interface, to start the Psexesvc service on the remote system.

The Psexesvc service creates a named pipe, psexecsvc, to which PsExec connects and sends commands that tell the service on the remote system which executable to launch and which options you've specified. If you specify the -d (don't wait) switch, the service exits after starting the executable; otherwise, the service waits for the executable to terminate, then sends the exit code back to PsExec for it to print on the local console.

Все антивирусы будут орать хором  smile 
PM MAIL   Вверх
gutalin69
Дата 6.5.2014, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 15.4.2014

Репутация: нет
Всего: нет



спасибо, вернулся наконец-то к этому заданию, _popen  не помогло, но идея открывать пайпы оказалась полезной, получилось нечто такое.... но, работает , к сожалению, только с фиксированным размером принимаемого буфера (4096) , что  не очень правильно, ведь размер чтения должен быть переменным
Код


Process::CreateInformation l_createInformation;

        

        SECURITY_ATTRIBUTES pipeSA ={sizeof(SECURITY_ATTRIBUTES),NULL,TRUE};
        
        cpp::native::ntos::Nt::Handle in,out;
        if (!CreatePipe((PHANDLE)&in, (PHANDLE)&out, &pipeSA, 1024))printf("невозможно создать канал");
        
        pipeSA.bInheritHandle = true;
    

        
        
        Process::create(l_createInformation, l_commandLine,Process::StartupInformation(out ));
        CloseHandle((HANDLE)out);

                
        bool is_true=true;
        const int l_kol = 4096;
        DWORD dwRead=1;
        bool l_Success = false;
        
        
        WideCharacter buf[ l_kol] ={0};
        WideCharacter nill = 0;
        TypeSize size = l_kol;

        CRunTime::fill(buf, nill, size);
        setlocale( LC_CTYPE,"");
        
        while (is_true)
        
        {
            l_Success = ReadFile((HANDLE)in, buf,l_kol,&dwRead, NULL) != 0;
            printf("\n");
            printf(" %s",buf);
            if (dwRead == 0) break;
        
            if (!l_Success || dwRead == 0)
            {
                break;
            }
        
        } 
        Synchronization::waitForSingleObject(l_createInformation.processHandle);
        Thread::close(l_createInformation.threadHandle);
        Process::close(l_createInformation.processHandle);


        

Это сообщение отредактировал(а) gutalin69 - 6.5.2014, 17:27
PM MAIL   Вверх
xvr
Дата 7.5.2014, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(gutalin69 @  6.5.2014,  16:53 Найти цитируемый пост)
но, работает , к сожалению, только с фиксированным размером принимаемого буфера (4096) , что  не очень правильно, ведь размер чтения должен быть переменным

Обычно читают кусками (можно и по 4096 байт), их склеивают, а потом нарезают по строкам (если нужны строки)
А почему с _popen не сработало?

PM MAIL   Вверх
gutalin69
Дата 8.5.2014, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 15.4.2014

Репутация: нет
Всего: нет



_popen у меня срабатывал, но почму-то создавал много-много одинаковых процессов  и комп тупо умирал от нехватки памяти, хотя _popen делался не в цикле, наврное делал я как-то не так, но в итоге с пайпами всё сейчас работает!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1937 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.