スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--.--.-- | スポンサー広告

WMIプログラムC++編-3

英語の MSDN を色々斜め読みしたが
Windows2000 のアプリケーションの実行権限を変更する方法が見つからなかった_| ̄|○

う~ん、「別のユーザーとして実行」ダイアログを表示する方法はないのだろうか?




WMIプログラムC++編-3
斜め読みしていて分かったのだが
Windows2000 のみ CoInitializeSecurity の設定が違うのは
サーバーによって NTLMDomain 認証と Kerberos 認証を使うからのようだ。

う~ん、もう少しセキュリティの勉強しないとダメだなあ~と思った(;´-`)y-~~

とりあえず前回の予告どおり、WMIにてアプリケーションを実行する方法を紹介。
しかしただ実行するだけではつまらない!
……ということでチョット改良してみました。

<Win32_Process 周りの説明>
IWbemServices の GetObject を使用してクラスオブジェクトを取得。
取得したオブジェクト の GetMethod を使用して "Create"メソッドを取得。
その後 SpawnInstance を使用してインスタンスを取得し Put で
値を設定します。
Win32_ProcessStartup も同じような感じです。
最後に ExecMethod で実行です。
VB などと比べると面倒ですね^^;

#define _WIN32_DCOM
#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>
using namespace std;

#pragma comment(lib, "wbemuuid.lib")

int main(int argc, char **argv)
{
IWbemLocator *wbem_locator = NULL;
IWbemServices *wbem_services = NULL;
IEnumWbemClassObject *wbem_enumerator = NULL;

// 各種初期化
::CoInitializeEx(0, COINIT_MULTITHREADED);

::CoInitializeSecurity(NULL, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL, EOAC_NONE, NULL);

::CoCreateInstance(CLSID_WbemLocator, 0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
reinterpret_cast(&wbem_locator));

// 接続開始
wbem_locator->ConnectServer(_bstr_t(L"\\\\.\\ROOT\\CIMV2"),
NULL, NULL, 0, NULL,
0, 0, &wbem_services);

::CoSetProxyBlanket(wbem_services,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE, NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL, EOAC_NONE);

// Win32_ProcessStartup の設定
IWbemClassObject* wmi_startup = NULL;
wbem_services->GetObject(_bstr_t(L"Win32_ProcessStartup"),
0, NULL, &wmi_startup, NULL);

IWbemClassObject* startup_instance = NULL;
wmi_startup->SpawnInstance(0, &startup_instance);

// ウインドウ最大化
VARIANT show;
VariantInit(&show);
show.vt = VT_I2;
show.intVal = SW_SHOWMAXIMIZED;
startup_instance->Put(_bstr_t(L"ShowWindow"), 0, &show, 0);
VariantClear(&show);

// Win32_Process の設定
IWbemClassObject* wmi_process = NULL;
wbem_services->GetObject(_bstr_t(L"Win32_Process"), 0,
NULL, &wmi_process, NULL);

IWbemClassObject* params_definition = NULL;
IWbemClassObject* out_method = NULL;
wmi_process->GetMethod(_bstr_t(L"Create"), 0,
¶ms_definition, &out_method);

IWbemClassObject* process_instance = NULL;
params_definition->SpawnInstance(0, &process_instance);

// EXE ファイルの指定
VARIANT file_name;
VariantInit(&file_name);
file_name.vt = VT_BSTR;
// OS によって適宜ファイルパスを替えてください^^;
file_name.bstrVal = _bstr_t("C:\\WINNT\\system32\\notepad.exe");
process_instance->Put(_bstr_t(L"CommandLine"), 0, &file_name, 0);
VariantClear(&file_name);

// Win32_ProcessStartup の指定
VARIANT startup;
VariantInit(&startup);
startup.vt = VT_DISPATCH;
startup.byref = startup_instance;
process_instance->Put(_bstr_t(L"ProcessStartupInformation"),
0, &startup, 0);
VariantClear(&startup);

wbem_services->ExecMethod(_bstr_t(L"Win32_Process"),
_bstr_t(L"Create"), 0, NULL,
process_instance, NULL, NULL);

// 後始末
startup_instance->Release();
wmi_startup->Release();
process_instance->Release();
out_method->Release();
params_definition->Release();
wmi_process->Release();
wbem_services->Release();
wbem_locator->Release();

::CoUninitialize();
return 0;
}

Win32_ProcessStartup の ShowWindow に SW_SHOWMAXIMIZED を
指定することによってノートパッドが最大化の状態で起動します。

最初 ProcessStartupInformation に指定する Variant Type は
なにかな? と思い、とりあえず VT_BYREF を指定したらものの見事に
はずれorz
一番怪しそうな VT_DISPATCH を指定したらとりあえず起動^^;
とはいえこの辺かなりプログラムが怪しいです……
といっても資料がないしなあ~

本当はWMIを使用したイベントシンクやサービスなんかもしたかったのですが
今回はこれにて終了(・∀・)
次回はXMLでも載せようかな~と思ってます。




スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

2005.11.01 | Comments(1) | Trackback(0) | プログラム

コメント

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

2009-11-19 木 20:16:30 | | # [ 編集]

コメントの投稿


秘密にする

«  | HOME |  »

ブロとも申請フォーム

この人とブロともになる

カウンター


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。