以管理员与管理员组身份运行

Fre*_*oot 5 c# windows winapi

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

如果答案是"它只是以这种方式运行,即使你是管理员,你也必须以管理员身份运行",我的问题是如何检测它们是否以超级管理员权限运行?我发现了这一点,但它只是检查用户是否属于管理员用户组,我已经指出,这是不够的(并抛出空指针异常).

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

Dav*_*nan 8

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

当管理员组中的用户登录时,将为用户分配两个令牌:具有所有权限的令牌和具有降低权限的令牌.当该用户创建新进程时,默认情况下该进程将使用简化权限令牌.因此,虽然用户具有管理员权限,但默认情况下她不会使用它们.这是一个"好东西"™.

要行使这些权利,用户必须以提升的权限启动该过程.例如,通过使用"以管理员身份运行"动词.当她这样做时,完整的令牌将被传递给新流程,并且可以行使全部权利.

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

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

您的下一步是在MSDN上查看详细信息.例如: