如何通过c#以编程方式更改COM安全设置?
我需要使用.NET方法以编程方式更改COM安全权限。 我指的是这些设置:如何通过c#以编程方式更改COM安全设置?,c#,.net,C#,.net,我需要使用.NET方法以编程方式更改COM安全权限。 我指的是这些设置: 我该怎么做?谢谢 据我所知,没有API可以做到这一点。但是,COM和DCOM访问控制是在注册表中设置的,主要是在“匿名”OLE下设置的(由于历史原因)。同时.NET有标准类来操作注册表 因此,面对这项任务,我应该做以下几点: 启动注册表监视器,如Mark Russinovich的 使用windows UI以交互方式设置一些COM设置,并监视注册表更改 可选但强烈建议:在具有一些目标明确的搜索关键字( 注册表项)尝试在g
我该怎么做?谢谢 据我所知,没有API可以做到这一点。但是,COM和DCOM访问控制是在注册表中设置的,主要是在“匿名”OLE下设置的(由于历史原因)。同时.NET有标准类来操作注册表 因此,面对这项任务,我应该做以下几点:
- 启动注册表监视器,如Mark Russinovich的
- 使用windows UI以交互方式设置一些COM设置,并监视注册表更改
- 可选但强烈建议:在具有一些目标明确的搜索关键字( 注册表项)尝试在google中查找文档/代码,或者更好的方法 在代码中的github中搜索
- 实现我的C#类,操作适当的 注册表类
- HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Ole\DefaultAccessPermission
- HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Ole\DefaultLaunchPermission
- 我知道这个热带地区很古老,但这是我最后使用的解决方案,以防有人需要它。如上所述,我找不到任何API来做这件事,必须直接在存储SIT的注册表项上工作。
应编辑填充键:
static class ComACLRights
{
public const int COM_RIGHTS_EXECUTE = 1;
public const int COM_RIGHTS_EXECUTE_LOCAL = 2;
public const int COM_RIGHTS_EXECUTE_REMOTE = 4;
public const int COM_RIGHTS_ACTIVATE_LOCAL = 8;
public const int COM_RIGHTS_ACTIVATE_REMOTE = 16;
}
static void Main(string[] args)
{
SetCOMSercurityAccess("testuser", "DefaultAccessPermission");
SetCOMSercurityAccess("testuser", "DefaultLaunchPermission");
}
private static void SetCOMSercurityAccess(string username, string regKey)
{
//Get sid from username
NTAccount f = new NTAccount(username);
SecurityIdentifier sid = (SecurityIdentifier)f.Translate(typeof(SecurityIdentifier));
//Read reg key responsible for COM Sercurity
var accessKey = Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Ole", regKey, null);
RawSecurityDescriptor sd;
if (accessKey == null)
{
//Key does not exist
sd = new RawSecurityDescriptor("");
}
else
{
//read security settings
sd = new RawSecurityDescriptor(accessKey as byte[], 0);
}
//Look fo input foruser
var acl = sd.DiscretionaryAcl;
var found = false;
foreach (CommonAce ca in acl)
{
if (ca.SecurityIdentifier == sid)
{
//ensure local access is set
ca.AccessMask |= ComACLRights.COM_RIGHTS_EXECUTE | ComACLRights.COM_RIGHTS_EXECUTE_LOCAL | ComACLRights.COM_RIGHTS_ACTIVATE_LOCAL; //set local access. Always set execute
found = true;
break;
}
}
if (!found)
{
CommonAce ca = new CommonAce(
AceFlags.None,
AceQualifier.AccessAllowed,
ComACLRights.COM_RIGHTS_EXECUTE | ComACLRights.COM_RIGHTS_EXECUTE_LOCAL | ComACLRights.COM_RIGHTS_ACTIVATE_LOCAL,
sid,
false,
null);
acl.InsertAce(acl.Count, ca);
}
//re-set the ACL
sd.DiscretionaryAcl = acl;
//Convert back to binary and save
byte[] binaryform = new byte[sd.BinaryLength];
sd.GetBinaryForm(binaryform, 0);
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Ole", regKey, binaryform, RegistryValueKind.Binary);
}
这段代码的灵感主要来自于这就是我成功做到的。我分享了这个答案中的代码:很高兴有人在实践中成功地应用了这个方法