Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过c#以编程方式更改COM安全设置?_C#_.net - Fatal编程技术网

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

如何通过c#以编程方式更改COM安全设置?,c#,.net,C#,.net,我需要使用.NET方法以编程方式更改COM安全权限。 我指的是这些设置: 我该怎么做?谢谢 据我所知,没有API可以做到这一点。但是,COM和DCOM访问控制是在注册表中设置的,主要是在“匿名”OLE下设置的(由于历史原因)。同时.NET有标准类来操作注册表 因此,面对这项任务,我应该做以下几点: 启动注册表监视器,如Mark Russinovich的 使用windows UI以交互方式设置一些COM设置,并监视注册表更改 可选但强烈建议:在具有一些目标明确的搜索关键字( 注册表项)尝试在g

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


我该怎么做?谢谢

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

因此,面对这项任务,我应该做以下几点:

  • 启动注册表监视器,如Mark Russinovich的

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

  • 可选但强烈建议:在具有一些目标明确的搜索关键字( 注册表项)尝试在google中查找文档/代码,或者更好的方法 在代码中的github中搜索

  • 实现我的C#类,操作适当的 注册表类


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

      • HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Ole\DefaultAccessPermission
      • HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Ole\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);
      }
      

      这段代码的灵感主要来自于

      这就是我成功做到的。我分享了这个答案中的代码:很高兴有人在实践中成功地应用了这个方法