如何在Guest账户下以管理员身份运行C#应用程序

4
我之前的问题没有得到正确的答案,而是收到了很多回答:“我们不能这样做”。因此,我决定详细说明我的问题,请帮忙解决或请你的朋友提供帮助。
现在,我的问题是:
步骤1:
我创建了一个C#程序,用于编辑各种Windows注册表。要编辑Windows注册表,我们必须拥有管理员权限。我的程序在管理员模式下运行良好,没有任何问题。
步骤2:
我希望我的程序也能在受限制的用户模式下运行。如果有人不理解我的意思,我想在Guest模式下运行上述C#代码。在Guest模式下,有一项限制,即我们无法更改Windows注册表。因此,当我执行我的应用程序时,会弹出一个提示,要求输入管理员密码。在输入管理员密码后,我的应用程序可以正常工作。
步骤3:
我希望我的应用程序不必每次在Guest/受限制的帐户中都要求管理员密码。我还希望在Guest模式下,我的应用程序可以工作,并且可以访问和更改Windows注册表。
步骤4:
很多人回答说,由于安全原因,Windows限制用户编辑Windows注册表,因此我们无法在Guest模式下进行此操作。因此,请不要回答这个问题。我回答那些人,所有良好的杀毒软件都可以在Guest模式下访问Windows注册表。
步骤5:
1. 由于我知道管理员密码,是否有任何方法可以将管理员密码保存在我们的C#代码中,并绕过反复询问管理员密码的弹出消息?
2. 是否有任何方法可以告诉Windows我们的应用程序将以管理员模式运行,并且不再反复询问管理员密码?
3. 杀毒软件如何在Guest模式下执行所有操作,例如从system32文件夹中删除病毒,并在病毒攻击后重置注册表?这些杀毒软件从不要求“我们在System32文件夹中发现了一个病毒,由于我正在Guest模式下运行且无法删除病毒,请输入管理员密码,以便我可以删除病毒”。
我希望你明白我的问题。
我想开发一个C#应用程序,可以在任何模式(管理员/ Guest / 受限制)下运行,并能够创建、编辑和删除Windows注册表。
注意:请不要回答“右键单击并以管理员身份运行”这个问题。

1
防病毒软件包通常以管理员身份运行,并且大多数情况下还会安装驱动程序(.sys)。 - Simon Mourier
1
只是因为你(明显地)非常渴望某事,并不意味着它是可能的(尤其是在第5步、第1点这种情况下,但当然也不仅限于此)。你应该重新思考你的设计。 - Christian.K
你所寻找的是所谓的模拟登录 - 已编辑链接。即使在代码块级别上也是可能的。但如果你想存储管理员密码,请注意安全风险,并且永远不要将其以明文形式存储在任何地方,至少要使用加密。 - mtijn
@mtijn:是的,但那样他就不行了。他明确表示他不想要“通知”(很可能是UAC提示),尤其不想输入密码。据我所知,你无法从代码中规避UAC提示,更不用说插入密码了。徒劳无功。 - Christian.K
这是一条不错的情报..那么怎么样手动创建令牌呢?虽然这很麻烦。 - mtijn
显示剩余2条评论
2个回答

2
据我所知,杀毒软件通过运行两个(或更多)进程来解决这个问题:一个作为访客用户运行的用户界面程序和一个特权进程(通常是Windows服务)。 用户程序无法实际操作受权限限制的资源(如安全注册表),而是与特权进程进行通信(希望以某种安全方式),并且特权进程代表用户执行特权操作。
这是程序访问特权资源(例如硬件)的相同技术。您的用户级进程通常没有执行各种硬件操作的权限,例如在MMU中重新映射内存,但操作系统有该权限,并且您可以通过请求操作系统来使其执行您想要的操作。系统调用会转换到完全特权的内核模式。但是,系统调用接口限制了您可以执行的特权操作类型。

特权进程(通常是Windows服务)即使在管理员模式下也无法编辑注册表。为了编辑Windows注册表,我们的代码必须是一个进程或应用程序。如果您说使用Windows服务可以编辑注册表,请告诉我如何操作? - Rahul Gupta
你认为由特权进程生成的进程能够修改注册表吗?如果是,即使特权进程是Windows服务,此答案也适用,因为它可以生成另一个进程来修改注册表。 - mtijn
@Rahul:我有点困惑。如果你正在以管理员用户(像SYSTEM这样的真正管理员用户,而不仅仅是拥有UAC权限的用户)运行Windows服务,它确实可以附加到本地注册表hive(例如HKLM、HKCR)并修改键和值。或者你描述的是另外一种情况? - Daniel Pryden

1

我不得不说,不行,你不能在访客账户下进行管理员操作。而且,你不能编程方式绕过UAC。

也许以下两种解决方法对你有用?

我相信杀毒软件是在系统账户下运行的(只能由管理员安装)。对于你的应用程序,你可以创建一个服务器/客户端架构(两者都在同一台机器上运行),其中服务器由管理员安装(作为整个包的一部分)并默认情况下在系统账户下运行。然后,你可以在访客账户上使用客户端向服务器发送命令。

另一个解决方案可能是不直接使用注册表,而是使用另一个底层数据存储区,该存储区可被访客账户访问,并按需与注册表同步(启动和关闭时?),因此你只需要在运行应用程序期间登录一两次管理员账户。


你知道吗,我正在使用管理员帐户安装我的应用程序,但在执行我的应用程序之前进入访客模式时,它要求管理员权限。我的问题是,你能否提供解决方案,使UAC提示不会每次出现。如果你的解决方案是在管理员模式下安装,然后程序必须工作,那么我也这样做,因为在访客模式下我们无法安装任何应用程序。 - Rahul Gupta
@Rahul:管理员用户安装的软件和作为管理员用户执行的软件之间存在很大的区别。如果特权降低的用户启动您的程序,它将具有降低的权限(并需要 UAC)。解决方案是让您的管理员用户安装和启动程序,并在管理员用户离开后继续运行。在 Windows 上通常使用创建 Windows 服务的方式实现此操作。 - Daniel Pryden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接