1

Windowsクレデンシャルは、ローカルキャッシュと呼ばれるローカルシステムにキャッシュされます。これにより、ユーザーはドメインコントローラーに接続できないときにシステムにログオンできます。

これらのキャッシュされたクレデンシャルは、ハッシュとしてローカルシステムレジストリの値HKEY_LOCAL_MACHINE \ SECURITY \ CACHE \ NL$1からNL$10に保存されます。これにはシステムアカウントからのみアクセスできます。または、管理者にアクションを実行するためのアクセス許可を与える必要があります。

今、私は自分のc++コードからこれらのキャッシュにアクセスしようとしています。しかし、私は値を取得できませんでした。これらのキャッシュをC++コードから読み書きするためのソリューションを提供してください。

私が使用しているコード:

DWORD GetLocalMachineProfileBuffer(BYTE* pBuffer, DWORD nMaxLength )
{
LPCWSTR szSubKey = L"SECURITY\\CACHE";
LPCWSTR szValueName = L"NL$1";

    DWORD   rc; 
    DWORD   dwType; 
    HKEY    hOpenedKey;

    if( ERROR_SUCCESS == RegOpenKeyEx (HKEY_LOCAL_MACHINE,szSubKey,0,KEY_READ,&hOpenedKey) )
    {
        rc = RegQueryValueEx(hOpenedKey,szValueName,0,&dwType,(LPBYTE)pBuffer,&nMaxLength ); 
        if( rc != ERROR_SUCCESS ) 
        { 
            return (DWORD)-1;
        } 
        else 
        { 
            _ASSERT( dwType == REG_BINARY ); 
        } 

        RegCloseKey( hOpenedKey );
        return nMaxLength; 
    }
    else
    {
        return (DWORD)-1;
    }   
}

int _tmain(int argc, _TCHAR* argv[])
{
    static BYTE Buffer[200];
    DWORD nLength = GetLocalMachineProfileBuffer( Buffer, sizeof( Buffer ) );

    for(int i=0;i<200;i++) {
            printf("%0X ",Buffer[i]);
    }
    getch();
    return 0;
}
4

1 に答える 1

2

レジストリのこの領域を読み取るには、UNIX に相当する WindowsNT AUTHORITY\SYSTEMとしても知られているとして実行している必要があります。アクセスが拒否されたと思いますが、エラーメッセージを捨てています。LocalSystemroot

したがって、この:

 if( rc != ERROR_SUCCESS ) 
    { 
        return (DWORD)-1;
    } 

これでなければなりません:

   if( rc != ERROR_SUCCESS ) 
    { 
        return rc;
    } 

次に、または同様のものを使用して終了コードを確認し、echo %ERRORLEVEL%実際に発生しているエラーを確認できます。

プロセスをそのまま実行する最善の方法SYSTEMは、タスク スケジューラ API を使用してジョブを作成することです。

ローカル マシン名を指定することにより、ローカル マシンでこれを行うことができます。

于 2012-12-18T17:58:23.517 に答える