繁体   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