如何从C 读取Windows注册表的凭据缓存



Windows凭据被缓存在称为本地缓存的本地系统中。这将允许用户在无法联系域控制器时登录系统。

这些缓存的凭据被存储在本地系统注册表中的哈希值Hkey_local_machine Security 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 AUTHORITYSYSTEM运行,否则称为 LocalSystem- windows等同于unix root。我猜您正在被拒绝访问,但是您正在丢弃错误消息。

所以:

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

应该是这样:

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

然后,您可以使用echo %ERRORLEVEL%或类似方法检查退出代码,并找出实际遇到的错误。

SYSTEM的形式运行过程的最佳方法是使用任务调度程序API创建作业。

  • 在上下文中启动远程进程

您可以通过指定本地计算机名称来在本地计算机上执行此操作。

最新更新