Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从c+;从Windows注册表读取凭据缓存+;_C++_C_Windows_Registry_Regedit - Fatal编程技术网

C++ 如何从c+;从Windows注册表读取凭据缓存+;

C++ 如何从c+;从Windows注册表读取凭据缓存+;,c++,c,windows,registry,regedit,C++,C,Windows,Registry,Regedit,Windows凭据缓存在本地系统中,称为本地缓存。这将允许用户在无法联系域控制器时登录系统 这些缓存的凭据作为散列存储在本地系统注册表中的值HKEY_local_MACHINE\SECURITY\CACHE\NL$1到NL$10。这只能由系统帐户访问,或者我们必须授予管理员执行操作的权限 现在我试图从C++代码中访问这些缓存。但是我没有得到这些值。请给出一个C++代码读取和写入高速缓存的解决方案。 我正在使用的代码: DWORD GetLocalMachineProfileBuffer(BYTE

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;
}
DWORD GetLocalMachineProfileBuffer(字节*pBuffer,DWORD nMaxLength)
{
LPCWSTR szSubKey=L“安全\\缓存”;
LPCWSTR szValueName=L“NL$1”;
德沃德;
DWORD dwType;
香港大学霍普内德基分校;
if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE、szSubKey、0、KEY_READ和hOpenedKey))
{
rc=RegQueryValueEx(hOpenedKey、szValueName、0和dwType、(LPBYTE)pBuffer和nMaxLength);
如果(rc!=错误\u成功)
{ 
返回(DWORD)-1;
} 
其他的
{ 
_断言(dwType==REG_二进制);
} 
RegCloseKey(hOpenedKey);
返回nMaxLength;
}
其他的
{
返回(DWORD)-1;
}   
}
int _tmain(int argc,_TCHAR*argv[]
{
静态字节缓冲区[200];
DWORD nLength=GetLocalMachineProfileBuffer(缓冲区,sizeof(缓冲区));

对于(int i=0;i要读取注册表的此区域,您必须以
NT AUTHORITY\SYSTEM
的身份运行,否则称为
LocalSystem
——与unix
root
相当的windows。我猜您的访问被拒绝,但您正在丢弃错误消息

因此:

 if( rc != ERROR_SUCCESS ) 
    { 
        return (DWORD)-1;
    } 
应该是这样的:

   if( rc != ERROR_SUCCESS ) 
    { 
        return rc;
    } 
然后,您可以使用
echo%ERRORLEVEL%
或类似工具检查退出代码,并找出您实际遇到的错误

让进程作为
SYSTEM
运行的最佳方法是使用任务调度器API创建作业


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

我已将fullcontrol权限授予我的管理员帐户…0xEA为234,这是错误\u MORE\u DATA=“更多数据可用”。如果您阅读
RegQueryValueEx
的文档,您将确切了解这意味着什么以及如何处理它。