掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
RegSaveKeyによるレジストリのエクスポート方法について (ID:68725)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
シャノンさん ありがとうございました!! あの後、一つ参考ページを見つけたのですが ( http://support.microsoft.com/kb/128731/ja ) 実は、今のところ管理者権限でもうまく言っていなかったんです。 んで、上記のサイトを参考に、以下のようにエクスポート、インポートの関数 を修正しました。 //インターネットの設定をエクスポートする関数 BOOL ExportInternetSettings(char *RegFileName) { HKEY l_hKey; DWORD dwDisposition; LPVOID lpMessageBuffer; LONG l_Ret; HANDLE l_hToken; LUID l_luid; TOKEN_PRIVILEGES l_tp; //RegSaveKeyを行う為の特権を有効する //まずはトークンを開く if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &l_hToken)) { FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL); MessageBox(NULL, (LPCSTR)lpMessageBuffer, "OpenPricessToke実行エラー", MB_OK); LocalFree( lpMessageBuffer ); return FALSE; } //次にLUID取得 if(!LookupPrivilegeValue(NULL, SE_BACKUP_NAME, &l_luid)) { FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL); MessageBox(NULL, (LPCSTR)lpMessageBuffer, "LookupPrivilegeValue実行エラー", MB_OK); LocalFree( lpMessageBuffer ); CloseHandle(l_hToken); return FALSE; } //トークン内の特権を有効にする l_tp.PrivilegeCount = 1; l_tp.Privileges[0].Luid = l_luid; l_tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(l_hToken, FALSE, &l_tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL ); if(GetLastError() != ERROR_SUCCESS) { FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL); MessageBox(NULL, (LPCSTR)lpMessageBuffer, "AdjustTokenPrivileges実行エラー", MB_OK); LocalFree( lpMessageBuffer ); AdjustTokenPrivileges(l_hToken, TRUE, NULL, 0, NULL, NULL); CloseHandle(l_hToken); return FALSE; } //レジストリを開く l_Ret = RegCreateKeyEx(HKEY_CURRENT_USER, INTERNET_CONNECTION_KEY, 0, NULL, REG_OPTION_BACKUP_RESTORE, KEY_QUERY_VALUE, NULL, &l_hKey, &dwDisposition); if(l_Ret != ERROR_SUCCESS) { FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, l_Ret, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL); MessageBox(NULL, (LPCSTR)lpMessageBuffer, "RegCreateKeyEx実行エラー", MB_OK); LocalFree( lpMessageBuffer ); AdjustTokenPrivileges(l_hToken, TRUE, NULL, 0, NULL, NULL); CloseHandle(l_hToken); return FALSE; } //レジストリをエクスポート l_Ret = RegSaveKey(l_hKey, RegFileName, NULL); if(l_Ret != ERROR_SUCCESS) { FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, l_Ret, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL); MessageBox(NULL, (LPCSTR)lpMessageBuffer, "RegSaveKey実行エラー", MB_OK); LocalFree( lpMessageBuffer ); AdjustTokenPrivileges(l_hToken, TRUE, NULL, 0, NULL, NULL); CloseHandle(l_hToken); RegCloseKey(l_hKey); return FALSE; } RegCloseKey(l_hKey); AdjustTokenPrivileges(l_hToken, TRUE, NULL, 0, NULL, NULL); CloseHandle(l_hToken); return TRUE; } //インターネットの設定をインポートする関数 BOOL ImportInternetSettings(char *RegFileName) { HKEY l_hKey; DWORD dwDisposition; LPVOID lpMessageBuffer; LONG l_Ret; HANDLE l_hToken; LUID l_luid; TOKEN_PRIVILEGES l_tp; //RegSaveKeyを行う為の特権を有効する //まずはトークンを開く if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &l_hToken)) { FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL); MessageBox(NULL, (LPCSTR)lpMessageBuffer, "OpenPricessToke実行エラー", MB_OK); LocalFree( lpMessageBuffer ); return FALSE; } //次にLUID取得 if(!LookupPrivilegeValue(NULL, SE_RESTORE_NAME, &l_luid)) { FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL); MessageBox(NULL, (LPCSTR)lpMessageBuffer, "LookupPrivilegeValue実行エラー", MB_OK); LocalFree( lpMessageBuffer ); CloseHandle(l_hToken); return FALSE; } //トークン内の特権を有効にする l_tp.PrivilegeCount = 1; l_tp.Privileges[0].Luid = l_luid; l_tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(l_hToken, FALSE, &l_tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL ); if(GetLastError() != ERROR_SUCCESS) { FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL); MessageBox(NULL, (LPCSTR)lpMessageBuffer, "AdjustTokenPrivileges実行エラー", MB_OK); LocalFree( lpMessageBuffer ); AdjustTokenPrivileges(l_hToken, TRUE, NULL, 0, NULL, NULL); CloseHandle(l_hToken); return FALSE; } //レジストリを開く l_Ret = RegCreateKeyEx(HKEY_CURRENT_USER, INTERNET_CONNECTION_KEY, 0, NULL, REG_OPTION_BACKUP_RESTORE, KEY_QUERY_VALUE, NULL, &l_hKey, &dwDisposition); if(l_Ret != ERROR_SUCCESS) { FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, l_Ret, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL); MessageBox(NULL, (LPCSTR)lpMessageBuffer, "RegCreateKeyEx実行エラー", MB_OK); LocalFree( lpMessageBuffer ); AdjustTokenPrivileges(l_hToken, TRUE, NULL, 0, NULL, NULL); CloseHandle(l_hToken); return FALSE; } //レジストリをインポート l_Ret = RegRestoreKey(l_hKey, RegFileName, REG_FORCE_RESTORE); if(l_Ret != ERROR_SUCCESS) { FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, l_Ret, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL); MessageBox(NULL, (LPCSTR)lpMessageBuffer, "RegRestoreKey実行エラー", MB_OK); LocalFree( lpMessageBuffer ); RegCloseKey(l_hKey); AdjustTokenPrivileges(l_hToken, TRUE, NULL, 0, NULL, NULL); CloseHandle(l_hToken); return FALSE; } RegCloseKey(l_hKey); AdjustTokenPrivileges(l_hToken, TRUE, NULL, 0, NULL, NULL); CloseHandle(l_hToken); return TRUE; } このように、特権を有効にしなければならなかったのですね・・・ これで、とりあえず管理者ではできそうです!! 後は、シャノンさんのアイデアのパイプにキーのハンドルを渡す方法を試して みます!! ナイスなアイデア、ありがとうございます☆ この場合、パイプで渡したキーのハンドルは、どちらがわでCloseHandleして も大丈夫なんですかね? コマンドの方は、おっしゃるとおりなので、適当にバッチでもつくって試して みます。 個人的にはAPIでバイナリで出力した方が、一見中身がわからないのでいいか な〜とは思っています。 本当にありがとうございました!!
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.