我试图使用DPAPI加密数据,但是它在执行NCryptProtectSecret时失败了,它返回:
0x80090034 (NTE_ENCRYPTION_FAILURE)
我用本地用户SID创建了NCryptCreateProtectionDescriptor:
"SID=S-1-5-21-2942599413-360359348-3087651068-500"然后,我使用这个描述符实例作为NCryptProtectSecret的输入,但是它不起作用。
如果我使用保护描述符:
"LOCAL=user"一切看起来都不错,但是它不适用于用户或组的SID。我已经在WindowsServer2012R2和Windows 2016上测试了这一点。
有什么想法吗?
下面是一个代码示例:
SECURITY_STATUS Status;
PBYTE ProtectedData = NULL;
ULONG ProtectedDataLength = 0;
NCRYPT_DESCRIPTOR_HANDLE DescriptorHandle = NULL;
LPCWSTR ProtectionDescString = L"SID=S-1-5-21-2942599413-360359348-3087651068-500";
Status = NCryptCreateProtectionDescriptor(
ProtectionDescString,
0,
&DescriptorHandle
);
// Status is ERROR_SUCCESS (zero)
LPCWSTR SecretString = L"Some message to protect";
PBYTE Secret = (PBYTE)SecretString;
DWORD SecretLength = (ULONG)( (wcslen(SecretString)+1)*sizeof(WCHAR) );
Status = NCryptProtectSecret(
DescriptorHandle,
0,
PlainText,
PlainTextLength,
NULL, // Use default allocations by LocalAlloc/LocalFree
NULL, // Use default parent windows handle.
&ProtectedData, // out LocalFree
&ProtectedDataLength
);
**// Status == NTE_ENCRYPTION_FAILURE**发布于 2017-07-18 22:06:27
我遇到了这个问题,发现原因是我们的域运行在一个功能级别上,低于2012年。在将域名升级到2012年之后,问题得到了解决。
确定功能级别的一种快速简便的方法是下面的PowerShell cmdlet
[system.directoryservices.activedirectory.Forest]::GetCurrentForest().ForestMode发布于 2016-12-27 13:29:18
将PlainText和PlainTextLength替换为PlainTextLength和SecretLength。
发布于 2017-04-05 13:46:42
我还没搞清楚是什么问题,但在不同的领域一切都很好。微软也证实了我们发送给他们的工作例子是正确的,但是他们没有解释问题出在哪里。
https://stackoverflow.com/questions/40192062
复制相似问题