Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск проги через WMI 
V
    Опции темы
teRmit
Дата 25.10.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


забытый...
*


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

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



День добрый!
Необходимо реализовать удаленный запуск приги (процесса) на другом компе (используя права доступа к компу). Через WMI (хотя не обяз.)
На C++ я это реализовал, и даже работает, но теперь мне нужно сделать это на дотнете(C#).

Читал в msdn про Management, но ничего не понял smile Как-то все скудненько написано.
Сделал еще так:  вкладка Server Explorer--> Servers --> <Комп> --> MenagmentClasses
Правой кнопкой миши на Processes и Generate Managment Class.
Посмотрел код, который нагенерила студия, но опять же не понял, как его использовать smile

Это вам не сиплюс-плюс... smile

Кто может помочь? Обьяснить, или хотя бы примерчик...
Очень надо...
--------------------
Жизнь не настолько длинна, чтобы можно было долго терпеть...
PM ICQ   Вверх
stab
Дата 25.10.2006, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

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



код на C++ в студию, пажалста! smile 


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
teRmit
Дата 25.10.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


забытый...
*


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

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



Цитата(cully @  25.10.2006,  17:32 Найти цитируемый пост)
код на C++ в студию, пажалста!

Это праздный интерес? smile Он ничем не поможет в плане сделать то же самое под .net, там все по-другому smile
Да и в msdn'е про работу с WMI под win32 написано гораздо лучше, больше и понятней, чем про работу с wmi под .net  smile 

Если просто интересно, могу выложить примерчик ;)

Добавлено @ 17:47 
Небольшой набросочек...

Код

#include "stdafx.h"
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
# pragma comment(lib, "wbemuuid.lib")
#include "Rpc.h"


int _tmain(int argc, _TCHAR* argv[])
{
    LPTSTR srv = argv[1];

    LPTSTR lpszSrvname = new TCHAR[13 + strlen(srv) + 1]; 
    sprintf(lpszSrvname, "\\\\%s\\root\\cimv2", srv);


    HRESULT hr;
    hr = CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hr))
    {
        return 1;
    }
    hr = CoInitializeSecurity(
        NULL, 
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_CALL,   // Default authentication 
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities 
        NULL                         // Reserved
        );
    if (FAILED(hr))
    {
        return -1;
    }
    IWbemLocator *pLoc = NULL;
    hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*) &pLoc);
    if (FAILED(hr))
    {
        return -1;
    }
    IWbemServices *pSvc = NULL;
         hr = pLoc->ConnectServer(_bstr_t(lpszSrvname), bstr_t(L"Administrator"), _bstr_t(L"password"), _bstr_t(L"MS_409"), NULL, NULL/*_bstr_t(L"ntlmdomain:sqlwatch")*/, 0, &pSvc);
if (FAILED(hr))
    {
        cout << "Could not connect. Error code = 0x" 
            << hex << hr << endl;
        pLoc->Release();     
        CoUninitialize();
        return 1;                // Program has failed.
    }

    cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;


    SEC_WINNT_AUTH_IDENTITY_W* pAuthIdentity = 
        new SEC_WINNT_AUTH_IDENTITY_W;
    ZeroMemory(pAuthIdentity, sizeof(SEC_WINNT_AUTH_IDENTITY_W));

    pAuthIdentity->User = (unsigned short*)(new WCHAR[32]);
    wcscpy((wchar_t*)pAuthIdentity->User , (L"Administrator"));
    pAuthIdentity->UserLength = wcslen((wchar_t*)pAuthIdentity->User);

    pAuthIdentity->Domain = (unsigned short*)new WCHAR[32];
    wcscpy((wchar_t*)pAuthIdentity-> Domain, (L"sqlwatch"));
    pAuthIdentity->DomainLength = wcslen((wchar_t*)pAuthIdentity->Domain);

    pAuthIdentity->Password = (unsigned short*)new WCHAR[32];
    //pAuthIdentity->Password[0] = NULL;
    wcscpy((wchar_t*)pAuthIdentity-> Password, (L"password"));
    pAuthIdentity->PasswordLength = wcslen((wchar_t*)pAuthIdentity->Password);

    pAuthIdentity->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;


    hr = CoSetProxyBlanket(
        pSvc,                        // Indicates the proxy to set
        RPC_C_AUTHZ_DEFAULT,           // RPC_C_AUTHN_xxx
        RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
        NULL,                        // Server principal name 
        RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
        RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
        pAuthIdentity,                        // client identity
        EOAC_NONE                    // proxy capabilities 
        );

    delete pAuthIdentity->Password;
    delete pAuthIdentity->Domain;
    delete pAuthIdentity->User;
    if (FAILED(hr))
    {
        cout << "Could not set proxy blanket. Error code = 0x" 
            << hex << hr << endl;
        pSvc->Release();
        pLoc->Release();     
        CoUninitialize();
        return 1;               // Program has failed.
    }

    BSTR MethodName = SysAllocString(L"Create");
    BSTR ClassName = SysAllocString(L"Win32_Process");

    IWbemClassObject* pClass = NULL;
    hr = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);

    IWbemClassObject* pInParamsDefinition = NULL;
    hr = pClass->GetMethod(MethodName, 0, 
        &pInParamsDefinition, NULL);

    IWbemClassObject* pClassInstance = NULL;
    hr = pInParamsDefinition->SpawnInstance(0, &pClassInstance);

    // Create the values for the in parameters
    VARIANT varCommand;
    varCommand.vt = VT_BSTR;
    varCommand.bstrVal = L"notepad.exe";

    // Store the value for the in parameters
    hr = pClassInstance->Put(L"CommandLine", 0,
        &varCommand, 0);
    wprintf(L"The command is: %s\n", V_BSTR(&varCommand));

    // Execute Method
    IWbemClassObject* pOutParams = NULL;
    IWbemCallResult* pRes = 0;
    hr = pSvc->ExecMethod(ClassName, MethodName, 0, NULL, pClassInstance, &pOutParams, &pRes);
    
    if (FAILED(hr))
    {
        cout << "Could not execute method. Error code = 0x" 
            << hex << hr << endl;
        VariantClear(&varCommand);
        SysFreeString(ClassName);
        SysFreeString(MethodName);
        pClass->Release();
        pInParamsDefinition->Release();
        pOutParams->Release();
        pSvc->Release();
        pLoc->Release();     
        CoUninitialize();
        return 1;               // Program has failed.
    }
....
ну и дальше очистка памяти и выход из программы)


Это сообщение отредактировал(а) teRmit - 25.10.2006, 17:42
--------------------
Жизнь не настолько длинна, чтобы можно было долго терпеть...
PM ICQ   Вверх
ivashkanet
Дата 25.10.2006, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



Вот что получилось:
Код

System.Management.ManagementPath mgmtPath = new System.Management.ManagementPath(@"\\127.0.0.1\root\cimv2:Win32_Process");
System.Management.ManagementClass classObj = new System.Management.ManagementClass(null, mgmtPath, null);

System.Management.ManagementBaseObject inParams = null;
inParams = classObj.GetMethodParameters("Create");
inParams["CommandLine"] = "notepad.exe";
inParams["CurrentDirectory"] = (@"C:\WINDOWS\system32\");

System.Management.ManagementBaseObject outParams = classObj.InvokeMethod("Create", inParams, null);

Работает, но хоть убейте не знаю как smile Вернее догадываюсь, но... не сильно smile

Выдрано отсюда:

Цитата(teRmit @  25.10.2006,  17:26 Найти цитируемый пост)
Сделал еще так:  вкладка Server Explorer--> Servers --> <Комп> --> MenagmentClassesПравой кнопкой миши на Processes и Generate Managment Class.


И из его метода 
Код

        public static uint Create(string CommandLine, string CurrentDirectory, System.Management.ManagementBaseObject ProcessStartupInformation, out uint ProcessId) {
            bool IsMethodStatic = true;
            if ((IsMethodStatic == true)) {
                System.Management.ManagementBaseObject inParams = null;
                System.Management.ManagementPath mgmtPath = new System.Management.ManagementPath(CreatedClassName);
                System.Management.ManagementClass classObj = new System.Management.ManagementClass(statMgmtScope, mgmtPath, null);
                bool EnablePrivileges = classObj.Scope.Options.EnablePrivileges;
                classObj.Scope.Options.EnablePrivileges = true;
                inParams = classObj.GetMethodParameters("Create");
                inParams["CommandLine"] = ((System.String )(CommandLine));
                inParams["CurrentDirectory"] = ((System.String )(CurrentDirectory));
                inParams["ProcessStartupInformation"] = ((System.Management.ManagementBaseObject )(ProcessStartupInformation));
                System.Management.ManagementBaseObject outParams = classObj.InvokeMethod("Create", inParams, null);
                ProcessId = System.Convert.ToUInt32(outParams.Properties["ProcessId"].Value);
                classObj.Scope.Options.EnablePrivileges = EnablePrivileges;
                return System.Convert.ToUInt32(outParams.Properties["ReturnValue"].Value);
            }
            else {
                ProcessId = System.Convert.ToUInt32(0);
                return System.Convert.ToUInt32(0);
            }
        }


Добавлено @ 20:56 
О еще и глюк подсветки кода нашелся smile  smile 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 26.10.2006, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Работать с WMI в .NET проще чем через COM (C++) на два порядка. В мсдн WMI подробнейше рассматривается - начиная с заглавной темы "WMI .NET Overview" (с кучей ссылок) и заканчивая описанием каждого WMI-класса и со-класса (находясь в MSDN Index, наберите Win32_ )

Цитата(ivashkanet @  25.10.2006,  20:54 Найти цитируемый пост)
О еще и глюк подсветки кода нашелся

это старый глюк, из-за символа @ перед строкой


--------------------
user posted image
PM MAIL WWW   Вверх
teRmit
Дата 26.10.2006, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


забытый...
*


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

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



Цитата(mr.DUDA @  26.10.2006,  10:40 Найти цитируемый пост)
начиная с заглавной темы "WMI .NET Overview"

Спасибо, нашел. Буду изучать. Раньше не там смотрел... smile
--------------------
Жизнь не настолько длинна, чтобы можно было долго терпеть...
PM ICQ   Вверх
teRmit
Дата 31.10.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


забытый...
*


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

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



Если кому интересно, вот что получилось. Примерный код, без всяких прверок и т.п. Кстати, если использовать код, нагенеренный студией, то все получается еще проще smile


Код

String sLogin, sPassword, sComputer;
...
//создание процесса на удаленной машине
ManagementScope ms;
ConnectionOptions co = new ConnectionOptions();
co.Username = sLogin;
co.Password = sPassword;
ms = new ManagementScope("\\\\" + sComputer + "\\root\\cimv2", co);
ms.Connect();
ManagementPath path = new ManagementPath("Win32_Process");
System.Management.ManagementClass classObj = new System.Management.ManagementClass(ms, path, null);
System.Management.ManagementBaseObject inParams = null;
inParams = classObj.GetMethodParameters("Create");
inParams["CommandLine"] = "notepad.exe"/*cPath*/;
inParams["CurrentDirectory"] = "c:\\"/*cWorkingFolder*/;
outParams =classObj.InvokeMethod("Create", inParams, null);

//и убийство этого процесса
ManagementObject process = new System.Management.ManagementObject((ManagementScope)(ms), new ManagementPath(ConstructPath(System.Convert.ToString(outParams.Properties["ProcessId"].Value))), null);
ManagementBaseObject inParams = null;
process.Scope.Options.EnablePrivileges = true;
inParams = process.GetMethodParameters("Terminate");
inParams["Reason"] = ((System.UInt32)(0));
ManagementBaseObject outParams = process.InvokeMethod("Terminate", inParams, null);
.....
private static string ConstructPath(string keyHandle)
        {
            string strPath = "ROOT\\CIMV2:Win32_Process";
            strPath = string.Concat(strPath, string.Concat(".Handle=", string.Concat("\"", string.Concat(keyHandle, "\""))));
            return strPath;
        }


--------------------
Жизнь не настолько длинна, чтобы можно было долго терпеть...
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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