簡體   English   中英

如何從 C++ 的 Windows 注冊表中讀取憑據緩存

[英]How to Read the Credentials cache from the Windows registry from c++

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;
}

為了讀取注冊表的這個區域,您必須以NT AUTHORITY\\SYSTEM運行,也稱為LocalSystem - Windows 等效於 unix root 我猜您正在拒絕訪問,但您正在丟棄錯誤消息。

所以這:

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

應該是這樣的:

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

然后您可以使用echo %ERRORLEVEL%或類似方法檢查退出代碼,並找出您實際遇到的錯誤。

使進程以SYSTEM身份運行的最佳方法是使用 Task Scheduler API 創建作業。

您可以通過指定本地計算機名稱在本地計算機上執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM