我有一个 C# 应用程序,需要允许用户更改计算机名称。这是一项相当特权的操作。仅当用户以管理员身份运行应用程序(Windows 7,右键单击可执行文件,“以管理员身份运行”)时,我才能使其正常工作。很好,但是用户是管理员,那么为什么他们需要运行AS管理员?我已经尝试过几次了。如果用户(管理员)尝试正常运行应用程序,它总是会失败。如果他们以“以管理员身份运行”运行它,它总是有效。
如果答案是,“它就是这样工作的,即使你是管理员,你也必须以管理员身份运行”,我的问题是如何检测它们是否以超级管理员权限运行?我发现this https://stackoverflow.com/questions/1220213/c-detect-if-running-with-elevated-privileges,但它只是检查用户是否属于管理员用户组,我已经指出,这是不够的(并引发空指针异常)。
我在这里错过了什么吗?我需要从另一个角度来看待它吗?
这是因为用户帐户控制 (UAC)。在 Vista 中引入,这改变了管理员用户帐户的操作方式。
当管理员组的用户登录时,系统会为该用户分配两个令牌:一个具有所有权限的令牌,一个具有较低权限的令牌。当该用户创建新进程时,默认情况下该进程将获得降低的权限令牌。因此,尽管用户拥有管理员权限,但默认情况下她并不行使这些权限。这是一件“好事”™。
要行使这些权利,用户必须以提升的权限启动该流程。例如,通过使用“以管理员身份运行”动词。当她这样做时,完整的令牌将被交给新进程,并且可以行使全部权利。
您几乎肯定不想检测您的进程是否正在提升运行。最佳实践是标记程序中需要提升的部分,并强制系统在程序的这些部分执行时显示 UAC 提升对话框。
绑定是提升只能在流程开始时发生。因此,如果您需要将应用程序拆分为需要提升的部分和不需要提升的部分,则需要多个进程。虽然您可以将整个应用程序标记为需要提升,但如果唯一需要提升的情况是更改计算机名称的极少数情况,则不应这样做。
下一步是在 MSDN 上深入了解详细信息。例如:
- http://msdn.microsoft.com/en-us/library/windows/desktop/bb756996.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/bb756996.aspx
-
http://msdn.microsoft.com/en-us/library/windows/desktop/aa511445.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/aa511445.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)