手动加入iis_user用户并分配所有权限得到的结果和编程做的结果不一样

jimu8130 2014-03-07 10:02:53
以下操作因为涉及到注册表的重要键,因此我最后将获取到的键写入到新建的键,否则会很危险,一旦更改失败就会导致无法进入系统。

我的代码:
/*
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;
}
*/
DiscretionaryAcl acl;

var localSystem = new SecurityIdentifier("S-1-5-32-568"); //这个就是iis_user的安全id编码,所有机器应该都一样的,至少win7上都一样,和机器无关。

var value = Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Ole", "DefaultLaunchPermission", null); // b2

CommonSecurityDescriptor cd = new CommonSecurityDescriptor(false, false, value as byte[], 0);

string debugstr = "All:" + cd.GetSddlForm(AccessControlSections.All) + " Access:" + cd.GetSddlForm(AccessControlSections.Access); //debugstr[2]

acl.AddAccess(AccessControlType.Allow, localSystem, 31, InheritanceFlags.None, PropagationFlags.None); //31是所有权限的叠加值,可以看看上面注释掉的那几行

cd.DiscretionaryAcl = acl;

debugstr = "All:" + cd.GetSddlForm(AccessControlSections.All) + " Access:" + cd.GetSddlForm(AccessControlSections.Access); //debugstr[1]

cd.GetBinaryForm(binaryform, 0);

Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Ole", "test", binaryform, RegistryValueKind.Binary);//b1(save data in a different key, so as to proectect the OS)

首先,我确保未添加iis_user并分配任何权限,然后运行代码得到debugstr[2],并记下操作后的注册表的值b1。
然后,我在手动在windows自带程序添加iis_user并分配权限,然后打开注册表记下当前值b2,接着运行代码并下断点在获得debugstr[1]后。
经过以上操作,我发现 debugstr[1]和debugstr[2]是相同的,但是b1和b2的值是不同的,请问大家知道这个该怎么解决么?

ps:1 我已经通过对比操作前后的注册表确定该操作影响的只有那个defaultlaunchpermission键 2 我通过 Win+R->输入dcomcnfg后运行->展开 component service节点直到看到我的电脑->右键我的电脑选择属性->转到页签com 安全->看运行和激活***那个区域 ->点击编辑默认**.. 然后查看或更改当前涉及到的用户及其权限.





...全文
659 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jimu8130 2014-03-07
  • 打赏
  • 举报
回复
高手来看看啦
jimu8130 2014-03-07
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
这个很难说,因为注册表不公开的键的修改是没有任何担保的。操作系统可能随时改写它们,因此如果你的程序同时操作它,会造成同步问题。如果你执意要这么做,先把调试的问题解决。你可以在虚拟机中跑,然后通过快照随时还原现场再试,而不用担心系统崩溃了需要再花很长时间把系统恢复才能继续调试。
感谢回复,不过也许你没看清楚我的操作步骤,我在手工操作也就是利用操作系统提供的界面来弄同时前后设定了快照对比,只影响到那一个键;我的手工操作和程序操作是不会同时进行的。手工操作仅仅是为了让程序获取到系统添加相同用户和权限后的一些属性或结果,程序操作的结果是写到另外一个键。另外我不知道你说的调试是做什么,我目前的代码能顺利运行,只是运行后的结果与手工操作的结果不对,而我分析不出原因
threenewbee 2014-03-07
  • 打赏
  • 举报
回复
这个很难说,因为注册表不公开的键的修改是没有任何担保的。操作系统可能随时改写它们,因此如果你的程序同时操作它,会造成同步问题。如果你执意要这么做,先把调试的问题解决。你可以在虚拟机中跑,然后通过快照随时还原现场再试,而不用担心系统崩溃了需要再花很长时间把系统恢复才能继续调试。
jimu8130 2014-03-07
  • 打赏
  • 举报
回复
高手来看看啦

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧