c# - 以管理员身份运行与管理员组

标签 c# windows winapi

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

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

我是不是漏掉了什么?我是否需要从另一个角度来看待它?

最佳答案

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

当来自管理员组的用户登录时,会为该用户分配两个 token :一个具有所有权限的 token ,一个具有较低权限的 token 。当该用户创建新进程时,默认情况下会向该进程发送缩减权限 token 。所以,虽然用户拥有管理员权限,但默认情况下她并没有行使这些权限。这是一件“好事”™。

要行使这些权利,用户必须以提升的权利启动进程。例如,通过使用“以管理员身份运行”动词。当她这样做时,完整的 token 将交给新流程,并且可以行使所有权利。

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

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

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

关于c# - 以管理员身份运行与管理员组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13711425/

相关文章:

c# - 在Arcgis中使用GeoReference使用Word文件

c# - WPF 的控件属性是否存在性能劣势?

c# - 获取当前 Windows 系统输入语言和语言更改时的通知

c++ - 如何使用 IGraphBuilder 播放 ogg Vorbis 文件

c - WinAPI win32 编程 - 按钮不可见

c# - Linq 对 Null 值进行排序

c# - Fluent NHibernate 一对多级联删除

c++ - 程序员思维过程 : determining a maximum number of bytes to read when using ReadFile with the Windows API

c# - 为什么必须为非查询打开连接而不是填充数据集?

客户端连接失败