0

特定のレジストリキー(ソフトウェアで作成)を取得しました。このキーは、ある時点で各ローカルユーザーアカウントで削除する必要があります。したがって、ユーザーハイブをロードしてから、SHDeleteKeyを使用して(キーが空ではないため)、ジョブを実行しようとします。ただし、SHDeleteKeyは常にLSTATUS 2(ERROR_FILE_NOT_FOUND)を返します。

各ユーザーのレジストリキーは、HKCU \ Software\XYZの下に配置されます

まず、コード内に必要な特権を設定しました。これは機能しているようです(return valはTRUEです)。

    (...)
HANDLE th;
LUID rsto;
LUID bckp;
TOKEN_PRIVILEGES tp;
TOKEN_PRIVILEGES tp2;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &th);
LookupPrivilegeValue(NULL, SE_RESTORE_NAME, &rsto);
LookupPrivilegeValue(NULL, SE_BACKUP_NAME, &bckp);
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
tp.Privileges[0].Luid = rsto;
tp2.PrivilegeCount = 1;
tp2.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
tp2.Privileges[0].Luid = bckp;
BOOL p = AdjustTokenPrivileges(th, 0, &tp, 1024, 0, 0);
BOOL p2 = AdjustTokenPrivileges(th, 0, &tp2, 1024, 0, 0);
    (...)

次に、RegloadKeyを使用してユーザーハイブをロードします。std :: string接続には、それぞれのntuser.datファイルへのパスが含まれています。usernameは、ローカルユーザーアカウント名です。したがって、ハイブはHKEY_USERS\usernameの下にロードする必要があります。

    (...)
DWORD result = RegLoadKey(HKEY_USERS, username.c_str(), connection.c_str());
return result == ERROR_SUCCESS;
    (...)

今、私は削除しようとします:

    (...)
    k = username + "\\Software\\XYZ";
    result = SHDeleteKey(HKEY_USERS, k.c_str());

そして今、結果は2の値を持っています。しかし、鍵は存在します。

私は何が間違っているのですか?前もって感謝します...

更新された情報:問題はRegLoadKeyのどこかにある必要があることに気づきました。コマンドラインからハイブをロードすると(REG.exe load "HKU \ username" ...)、regedit.exe内のHKEY_USERSの下にノード"username"が表示されます。すべての子ノードはそのノードの下にロードされます。RegLoadKeyの後でプログラムを一時停止すると、ノード「username」もHKEY_USERSの下に表示されますが、ノードは空として視覚化されるため、子ノードは使用できません。これはどのように起こりますか?この問題は私を狂わせています。

4

1 に答える 1

0

今日もう一度コードを確認したところ、「ntuser.DAT」ではなく「ntuser.BAT」をロードしたことがわかりました (両方のファイルが存在します)。

お時間を無駄にしてしまい、誠に申し訳ございませんでした。:-/

于 2012-05-10T05:20:45.463 に答える