如何通过c#以编程方式更改COM安全设置?

时间:2015-07-30 09:20:06

标签: c# .net

我需要使用.NET方法以编程方式更改COM安全权限。 我的意思是这些设置:

enter image description here

我该怎么做?谢谢!

2 个答案:

答案 0 :(得分:2)

据我所知,没有API可以做到这一点。但是COM和DCOM访问控制是在注册表中设置的,主要是在“隐身”OLE下(由于历史原因)。同时.NET有标准类来操作注册表。

所以这是我在面对这项任务时应该做的事情:

  • 启动注册表监控器,例如Mark Russinovich的formerly SysInternals, now Microsoft

  • 使用Windows UI以交互方式设置一些COM设置,并监控注册表更改。

  • 可选但强烈建议:在拥有一些非常有针对性的搜索关键字后( 注册表项)尝试在谷歌的doc /代码,或什么是更好的 在代码中的github中搜索

  • 实现我的C#类正在操作适当的东西 注册表类

答案 1 :(得分:1)

我知道这个热带地区很古老,但这里是我最终使用的解决方案,以防任何人需要它。如上所述,我找不到任何API来执行它,并且必须直接在存储坐位的注册表项上工作。 应编辑填充键:

  • HKEY_LOCAL_MACHINE \ SOFTWARE \微软\奥莱\ DefaultAccessPermission
  • HKEY_LOCAL_MACHINE \ SOFTWARE \微软\奥莱\ DefaultLaunchPermission

权限以二进制形式存储。 你可以尝试我的代码:

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);
}

此代码主要受this answer

启发