Я использую IX509PrivateKey для создания ключа для запроса сертификата X.509 (как «NT AUTHORITY\NETWORK SERVICE»), а метод Create генерирует отказ в доступе (я P/Invoke-ing интерфейс отправки из С# , поэтому HRESULT преобразуется в исключение .NET). Монитор процессов также показывает отказ в доступе к файлу ключа (файл ключа создается).
Вот фактический код:
IX509PrivateKey privateKey = new CX509PrivateKey() as IX509PrivateKey;
privateKey.Length = request.KeyLength;
privateKey.ExportPolicy = X509PrivateKeyExportFlags.XCN_NCRYPT_ALLOW_EXPORT_FLAG;
privateKey.KeySpec = X509KeySpec.XCN_AT_SIGNATURE;
privateKey.KeyUsage = X509PrivateKeyUsageFlags.XCN_NCRYPT_ALLOW_ALL_USAGES;
privateKey.MachineContext = true;
privateKey.Create();
return privateKey;
Если вместо этого я создам набор ключей пользователя (установив для MachineContext значение false), я увижу «Файл не найден» вместо «Отказано в доступе». Но ProcMon ничего не показывает; никаких попыток доступа к каким-либо ключевым файлам.
В Process Monitor я смог определить, что «Сетевая служба» не имеет доступа к файлу ключа, поэтому я использовал свойство IX509PrivateKey::SecurityDescriptor, чтобы установить его. «Сетевая служба» действительно тогда имела доступ к ключевому файлу, но я все еще получал отказ в доступе от Create, а ProcMon по-прежнему показывал отказ в доступе к файлу.
Много TIA для любых идей.