1

こんにちは、キーをロードしようとしていますHKLM\\SYSTEM\\CurrentControlSet\\Services\\Faxが、エラー 5 (アクセスが拒否されました) が表示されます。コードの何が問題なのかわかりません。

これが私のコードです

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

BOOL SetPrivilege(
    HANDLE hToken,          // access token handle
    LPCTSTR lpszPrivilege,  // name of privilege to enable/disable
    BOOL bEnablePrivilege   // to enable or disable privilege
) 
{
    TOKEN_PRIVILEGES tp;
    LUID luid;

    if ( !LookupPrivilegeValue( 
        NULL,            // lookup privilege on local system
        lpszPrivilege,   // privilege to lookup 
        &luid ) )        // receives LUID of privilege
{
    printf("LookupPrivilegeValue error: %u\n", GetLastError() ); 
    return FALSE; 
}

tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
    tp.Privileges[0].Attributes = 0;

// Enable the privilege or disable all privileges.

if ( !AdjustTokenPrivileges(
       hToken, 
       FALSE, 
       &tp, 
       sizeof(TOKEN_PRIVILEGES), 
       (PTOKEN_PRIVILEGES) NULL, 
       (PDWORD) NULL) )
{ 
      printf("AdjustTokenPrivileges error: %u\n", GetLastError() ); 
      return FALSE; 
} 

if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)

{
      printf("The token does not have the specified privilege. \n");
      return FALSE;
} 

return TRUE;
}
void _tmain(int argc, TCHAR *argv[])
{

HKEY   hKey;
LONG   lErrorCode;
HANDLE ProcessToken;
LPCWSTR subkey =  L"SYSTEM\\CurrentControlSet\\Services\\Fax";


if (OpenProcessToken(GetCurrentProcess(), 
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &ProcessToken)) 
{

    SetPrivilege(ProcessToken, SE_BACKUP_NAME, TRUE);
    SetPrivilege(ProcessToken, SE_RESTORE_NAME, TRUE);
    SetPrivilege(ProcessToken, SE_RESTORE_NAME, TRUE);

}


lErrorCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey ,
                              0, KEY_ALL_ACCESS, &hKey);
if (lErrorCode != ERROR_SUCCESS)
   {
  _tprintf(TEXT("Error in RegOpenKeyEx (%d).\n"), lErrorCode);
  return;
   }
else
{
    _tprintf(TEXT("Key is successfully Opened\n"));
}

lErrorCode = RegSaveKey(hKey,L"c:\\load.reg",0);
if (lErrorCode != ERROR_SUCCESS)
   {
  _tprintf(TEXT("Error in RegSaveKey (%d).\n"), lErrorCode);
  return;
   }
else
{
    _tprintf(TEXT("Key is successfully Saved \n"));
}

lErrorCode = RegLoadKey(HKEY_LOCAL_MACHINE,subkey,L"c:\\load.reg");
if (lErrorCode != ERROR_SUCCESS)
   {
  _tprintf(TEXT("Error in RegLoadKey (%d).\n"), lErrorCode);
  return;
   }
else
{
    _tprintf(TEXT("Key is successfully loaded \n"));
}

lErrorCode = RegCloseKey(hKey);
if (lErrorCode != ERROR_SUCCESS)
   {
  _tprintf(TEXT("Error in closing the key (%d).\n"), lErrorCode);
  return;
   }
else
{
    _tprintf(TEXT("Key is successfully closed \n"));
}
}

これが出力です

Key is successfully Opened 
Key is successfully Saved 
Error in RegLoadKey (5).
4

1 に答える 1

3

RegLoadKey新しいハイブをレジストリにロードするためにのみ使用できます。既存のハイブのサブキーを上書きするために使用することはできません。

RegRestoreKeyおそらく代わりに使用したいでしょう。

追加:

私の知る限りでは、ハイブはレジストリ ルートにしかロードできHKEY_LOCAL_MACHINE\fooませHKEY_USERS\fooHKEY_LOCAL_MACHINE\foo\bar。また、すでに存在する名前のハイブをロードすることはできないと思います。たとえば、ハイブを にロードすることはできませんHKEY_LOCAL_MACHINE\SOFTWARE。これらのことができたとしても、コンテンツをマージするのではなく、コンテンツのビューを変更することになり、システムを再起動すると元のコンテンツが再び表示されます。前述のように、既存のハイブにデータを挿入する場合RegRestoreKeyは、RegLoadKey.

の使用例について尋ねますRegLoadKeyが、多くはありません。ほとんどの場合、オペレーティング システムによって使用されます。たとえば、ログイン時に個人のハイブが読み込まれる方法です。オフラインでパスワードをリセットしたり、別の Windows インスタンスのレジストリを変更したりするHKEY_USERS\usernameなど、いくつかの奇妙なケースがあります。私が教育実習室のコンピュータに Windows を無人インストールするために使用するプロセスは、Windows インストール イメージのレジストリを変更してキーボードとマウスを無効にすることに依存しています。

于 2012-09-03T03:20:20.137 に答える