我找不到与我遇到的错误相关的任何内容。
问题是我在store.Add
下面遇到 CryptographicException:
“不支持该请求。”
MSDN 文档不是很有帮助,它指出:
无法将证书添加到存储中。
我使用以下代码作为指导,并进行了以下更改:
- 他们正在添加到 StoreName.My,我想添加到 StoreName.Root
- 我想使用 IDisposable 类来模拟用户。
我的概念验证代码(删节/伪劣):
public class UserLogonImpersonator : IDisposable
{
private WindowsImpersonationContext _impersonationContext = null;
private const int LOGON_INTERACTIVE = 2;
private const int PROVIDER_DEFAULT = 0;
[DllImport("advapi32.dll", SetLastError=true)]
private static extern int LogonUser(
string lpszUserName,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);
public UserLogonImpersonator()
{
_impersonationContext = null;
IntPtr userHandle = IntPtr.Zero;
const string domain = "domain";
const string user = "user";
const string hcpw = "password";
try
{
int logonResult = LogonUser(user, domain, hcpw,
LOGON_INTERACTIVE, PROVIDER_DEFAULT, ref userHandle);
bool isLoggedOn = logonResult != 0;
if (isLoggedOn)
{
_impersonationContext =
WindowsIdentity.Impersonate(userHandle);
}
}
catch(Exception e)
{
// Handle Exception
}
}
public void Dispose()
{
// UndoImpersonation();
}
// Private methods ...
}
public class CertService
{
public void AddCertToRootStore()
{
using(new UserLogonImpersonator())
{
X509Certificate2 rootCert =
new X509Certificate2(certData.CertFilePath);
X509Store store =
new X509Store(StoreName.Root, StoreLocation.CurrentUser);
store.Open(OpenFlags.MaxAllowed);
store.Add(rootCert);
store.Close();
}
}
}
我可以删除模拟并且不会引发异常,但这不是正确的用户商店。
StoreName.AuthRoot
通过模拟,我可以毫无例外地将证书放入。这不是我希望证书进入的商店。
这些无异常的解决方案都不起作用。我要求程序以提升的权限运行并进入另一个用户的商店。