gpt4 book ai didi

c# - 尝试在 C# 中的 KeyContainer 上设置权限无效

转载 作者:太空狗 更新时间:2023-10-29 20:08:52 24 4
gpt4 key购买 nike

我正在使用以下代码尝试以编程方式允许 NetworkService 帐户访问 key :

var RSA = new RSACryptoServiceProvider(
new CspParameters() {
KeyContainerName = "MyEncryptionKey",
Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore
});

RSA.CspKeyContainerInfo.CryptoKeySecurity.AddAccessRule(
new System.Security.AccessControl.CryptoKeyAccessRule(
new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null),
CryptoKeyRights.GenericAll,
AccessControlType.Allow
)
);

这段代码运行没有错误,但对 key 容器的权限没有影响。

然而,使用命令行工具 aspnet_regiis 做同样的事情,效果很好:

aspnet_regiis -pa "MyEncryptionKey" "NetworkService"

我以完全管理员权限运行 - 如果我不以这些权限运行,则会抛出异常。我还以最初创建 key 的用户身份运行。

key 容器始终具有以下访问规则:

S-1-5-18         -> LocalSystem
S-1-5-32-544 -> Administrators
S-1-5-5-0-135377 -> MyUser

使用 aspnet_regiis,SID,S-1-5-20 被添加到这个列表中。我无法通过代码影响它。

我试过从 sid 以字符串格式创建安全标识符,以及使用 SetAccessRule 而不是 AddAccessRule。

关于如何通过代码实际影响此 ACL 列表的任何想法?

最佳答案

您似乎没有调用 Persist。您对 CryptoKeySecurity 所做的更改实际上不会立即保存。您需要使用 Persist(...) 之一实际保存更改的方法。

<罢工> NativeObjectSecurity.Persist Method (String, AccessControlSections)

这些 API 似乎遵循了一种相当复杂的修改方法。您需要先创建一个 CspParameters,应用必要的更改,然后从这些参数构建提供程序。构造调用容器上的更新。

var params = new CspParameters
{
KeyContainerName = "MyEncryptionKey",
Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore
};

params.CryptoKeySecurity.AddAccessRule(
new System.Security.AccessControl.CryptoKeyAccessRule(
new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null),
CryptoKeyRights.GenericAll,
AccessControlType.Allow
)
);

var RSA = new RSACryptoServiceProvider(params);

关于c# - 尝试在 C# 中的 KeyContainer 上设置权限无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3142755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com