我可以找到有关如何为DCOM进行编程的各种内容,但实际上找不到有关如何以编程方式设置/检查安全性的东西。

我并没有尝试重新创建dcomcnfg,但是如果我知道如何在C#中(最好是VB.net)重现dcomcnfg的所有功能,那么我的目标就已经实现。

我似乎无法在此上找到任何好的资源,也没有开源的API,甚至找不到有关如何执行每个步骤的快速示例。即使在这里,DCOM或dcomcnfg也返回很少的结果,而实际上没有关于如何设置/验证/列出安全性的结果。

如果有人对开放式API或某些示例有一些指示,我将不胜感激。

最佳答案

丹尼尔(Daniel)发布的答案非常有帮助。非常感谢,丹尼尔!

Microsoft's documentation的问题是它们指示注册表值包含二进制形式的ACL。因此,例如,如果您尝试设置计算机的默认访问权限(而不是按进程),则将访问注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole\DefaultAccessPermission。但是,在我最初尝试使用System.Security.AccessControl.RawACL类访问此 key 时失败。

正如Daniel的代码所示,该值实际上不是ACL,但实际上是其中包含ACL的SecurityDescriptor。

因此,即使我知道这篇文章很旧,我仍将发布我的解决方案,以检查和设置安全设置并为默认本地访问添加NetworkService。当然,您可以确定并做得更好,但是要开始使用,您只需要更改 key 和访问掩码即可。

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;
}
class Program
{
    static void Main(string[] args)
    {
        var value = Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Ole", "DefaultAccessPermission", null);

        RawSecurityDescriptor sd;
        RawAcl acl;

        if (value == null)
        {
            System.Console.WriteLine("Default Access Permission key has not been created yet");
            sd = new RawSecurityDescriptor("");
        }else{
            sd = new RawSecurityDescriptor(value as byte[], 0);
        }
        acl = sd.DiscretionaryAcl;
        bool found = false;
        foreach (CommonAce ca in acl)
        {
            if (ca.SecurityIdentifier.IsWellKnown(WellKnownSidType.NetworkServiceSid))
            {
                //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){
            //Network Service was not found.  Add it to the ACL
            SecurityIdentifier si = new SecurityIdentifier(
                WellKnownSidType.NetworkServiceSid, null);
            CommonAce ca = new CommonAce(
                AceFlags.None,
                AceQualifier.AccessAllowed,
                ComACLRights.COM_RIGHTS_EXECUTE | ComACLRights.COM_RIGHTS_EXECUTE_LOCAL | ComACLRights.COM_RIGHTS_ACTIVATE_LOCAL,
                si,
                false,
                null);
            acl.InsertAce(acl.Count, ca);
        }
        //re-set the ACL
        sd.DiscretionaryAcl = acl;

        byte[] binaryform = new byte[sd.BinaryLength];
        sd.GetBinaryForm(binaryform, 0);
        Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Ole", "DefaultAccessPermission", binaryform, RegistryValueKind.Binary);
    }
}

关于c# - dcomcnfg功能以编程方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/454368/

10-11 17:22