我正在使用以下代码尝试以编程方式允许 NetworkService 帐户访问密钥:
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
)
);
此代码运行没有错误,但对密钥容器的权限没有影响。
但是,使用命令行工具 aspnet_regiis 来做同样的事情,效果很好:
aspnet_regiis -pa "MyEncryptionKey" "NetworkService"
我正在以完全管理员权限运行 - 如果我不以这些权限运行,则会引发异常。我也以最初创建密钥的用户身份运行。
密钥容器始终具有以下访问规则:
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 列表?