5

我有一个 C# 应用程序需要允许用户更改Computer Name。这是一个非常特权的操作。如果用户以管理员身份运行应用程序(Windows 7,右键单击可执行文件,“以管理员身份运行”),我只能让它工作。很好,但是用户是管理员,那么他们为什么需要以管理员身份运行?我已经试过好几次了。如果用户(管理员)尝试正常运行应用程序,它总是会失败。如果他们以“以管理员身份运行”运行它,它总是有效的。

如果答案是“它就是这样工作的,即使你是管理员,你也必须以管理员身份运行”,我的问题是如何检测它们是否以超级管理员权限运行?我找到了这个,但它只是检查用户是否是管理员用户组的一部分,我已经指出,这还不够(并引发空指针异常)。

我在这里错过了什么吗?我需要从另一个角度接近它吗?

4

1 回答 1

11

这是因为用户帐户控制 (UAC)。在 Vista 中引入,这改变了管理员用户帐户的操作方式。

当管理员组中的用户登录时,会为该用户分配两个令牌:一个具有所有权限的令牌,一个具有降低权限的令牌。当该用户创建一个新进程时,默认情况下,该进程将获得降低的权限令牌。因此,尽管用户具有管理员权限,但默认情况下她不会行使这些权限。这是一件“好事”™。

要行使这些权利,用户必须以提升的权利开始该过程。例如,通过使用“以管理员身份运行”动词。当她这样做时,完整的令牌被交给新的进程,并且可以行使全部权利。

您几乎肯定不想检测您的进程是否正在运行提升。最佳实践是标记程序中需要提升的部分,并在程序的这些部分执行时强制系统显示 UAC 提升对话框。

绑定是提升只能在进程开始时发生。因此,如果您需要将应用程序拆分为需要提升的部分和不需要提升的部分,则需要多个进程。虽然您可以将整个应用程序标记为需要提升,但如果唯一需要提升的是计算机名称要更改的非常罕见的情况,则不应这样做。

您的下一步是在 MSDN 上详细了解详细信息。例如:

于 2012-12-04T20:54:55.830 回答