【问题标题】:How to check if a process has the administrative rights如何检查进程是否具有管理权限
【发布时间】:2011-12-24 04:05:03
【问题描述】:

如何正确检查进程是否以管理权限运行?

我检查了IsUserAnAdim function in MSDN,但不建议这样做,因为它可能会在后续版本的 Windows 中被更改或不可用。相反,建议使用CheckTokenMembership 函数。

然后我从CheckTokenMembership 函数的描述中查看了 MSDN 中的替代示例。但是,MSDN 中有 Stefan Ozminski 的评论,其中提到如果禁用UAC,此示例在 Windows Vista 中无法正常工作。

最后我尝试使用来自 MSDN 的 Stefan Ozminski 的代码,但它确定该进程具有管理权限,即使我在没有 Windows 7 中管理权限的普通用户下启动它。

【问题讨论】:

  • 如果这里不能显示任何代码,至少你可以给我们提供参考文章/cmets/code的链接?
  • 它将帮助很多人准确定义“管理权限”的含义。您的意思是它是否以管理员组中的用户身份运行?你的意思是它是否拥有完整的 UAC 权利?
  • 您尝试过 PrivilegeCheck API 吗?
  • 你为什么还要检查它?通常最好的策略是尝试。如果有效,则您有足够的权限(可能是管理员权限的子集),否则您没有(即使管理员也可能是这种情况 - 管理员权限不会覆盖 ACL)。

标签: c++ winapi


【解决方案1】:

这将告诉您是否以提升的权限运行。如果您希望它提示,您可以将清单设置为尽可能多地运行。还有其他方法可以通过代码向窗口询问备用凭据。

BOOL IsElevated( ) { BOOL fRet = FALSE; HANDLE hToken = NULL; if( OpenProcessToken( GetCurrentProcess( ),TOKEN_QUERY,&hToken ) ) { TOKEN_ELEVATION Elevation; DWORD cbSize = sizeof( TOKEN_ELEVATION ); if( GetTokenInformation( hToken, TokenElevation, &Elevation, sizeof( Elevation ), &cbSize ) ) { fRet = Elevation.TokenIsElevated; } } if( hToken ) { CloseHandle( hToken ); } return fRet; }

【讨论】:

  • 此代码检测程序是否以管理员身份运行。例如,如果您 ShellExecute("runas") 来自非管理员用户的程序并再次输入用户密码,则此测试将返回 TRUE
  • 它旨在让您知道您现在是否被提升或拥有管理权限。使用清单让你强制它,但有理由只是想知道,就像 cmd.exe 在标题栏中那样显示它,或者从不以海拔运行
  • @Beached:当然,但问题是如何判断进程是否已经以管理员身份运行。例如,如果您有一个通常以 Invoker 身份运行的程序,但可能需要以管理员身份重新启动以管理系统设置,则该程序希望能够判断它是否已经提升。
  • 注意:注意TokenElevation和TokenElevationType的区别:当UAC关闭时,TokenElevationType会一直返回TokenElevationTypeDefault,而TokenElevation告诉你进程提升了。参考:social.msdn.microsoft.com/Forums/windowsdesktop/en-US/…
  • @Codeguard 我尝试重现您用runas 描述的内容,但没有看到相同的行为。
【解决方案2】:

您可以使用LsaOpenPolicy() 函数。 LsaOpenPolicy 函数在本地或远程系统上打开 Policy 对象的句柄。

您必须以“以管理员身份”运行进程,这样调用才不会因ERROR_ACCESS_DENIED 而失败。

Source: MSDN

【讨论】:

  • 打开策略对象的句柄如何帮助 OP 解决他们的问题?
  • 除非您建议有问题的进程调用此函数以确定它是否具有访问权限?我怀疑这是一个非常糟糕的主意。
  • 正确。为什么进程调用函数判断自己是否有访问权限,如果有访问权限就用LsaClose()关闭是不对的?
  • 有很多缺点。 1) 如果启用了审核,则可以并且可能会对其进行审核,2) 如果系统配置异常,特别是如果以某种方式设置了请求的权限,则它不需要 需要管理权限。也就是说,在实践中,我想这可能不会比任何其他解决方案有更多的缺点......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多