我有一个C#应用,需要允许用户更改计算机名称。这是一项非常特权的操作。如果用户以管理员身份运行应用程序(Windows 7,右键单击可执行文件,“以管理员身份运行”),我只能让它工作。很好,但用户是管理员,为什么他们需要运行 AS 管理员?我试了好几次。如果用户(管理员)尝试正常运行应用程序,它总是会失败。如果它们以“以管理员身份运行”运行它总是有效。
如果答案是“它只是以这种方式工作,即使您是管理员,也必须以管理员身份运行”,我的问题是如何检测它们是否以超级管理员权限运行?我找到this,但它只是检查用户是否属于管理员用户组,我已经指出,这是不够的(并抛出空指针异常)。
我在这里遗漏了什么吗?我是否需要从另一个角度来接近它?
答案 0 :(得分:8)
这是因为用户帐户控制(UAC)。在Vista中引入,这改变了管理员用户帐户的运行方式。
当管理员组中的用户登录时,将为用户分配两个令牌:具有所有权限的令牌和具有降低权限的令牌。当该用户创建新进程时,默认情况下该进程将使用简化权限令牌。因此,虽然用户具有管理员权限,但默认情况下她不会使用它们。这是一个“好事”™。
要行使这些权利,用户必须以提升的权限启动该过程。例如,通过使用“以管理员身份运行”动词。当她这样做时,完整的令牌将被移交给新流程,并且可以行使所有权利。
您几乎肯定不想检测您的进程是否正在升级。最佳做法是标记程序中需要提升的那些部分,并强制系统在程序的这些部分执行时显示UAC提升对话框。
绑定是提升只能在进程开始时发生。因此,如果您需要将应用程序拆分为需要提升的部分,而将部分拆分为不需要提升的部分,则需要有多个进程。虽然您可以将整个应用程序标记为需要提升,但如果需要提升的唯一内容是非常罕见的需要更改计算机名称的情况,则不应这样做。
您的下一步是在MSDN上查看详细信息。例如: