win32 api - 如何检查远程机器上的用户权限
Posted
技术标签:
【中文标题】win32 api - 如何检查远程机器上的用户权限【英文标题】:win32 api - how to check for user privileges on a remote machine 【发布时间】:2010-10-19 13:52:36 【问题描述】:给定远程计算机上的本地帐户或域帐户的用户凭据,我如何检查这些凭据在远程主机上授予的用户权限?
我可以查找该帐户的 SID,但我如何知道,例如,该帐户是否是远程主机上管理员组的成员?
我可以找到大量用于检查本地管理员组的示例(例如 How do I check if a user has local admin privileges in win32),但看起来 CreateWellKnownSid 仅适用于 localhost。
欢迎提供任何线索/指针/代码示例。
编辑:下面的 cmets 中有关我的问题的更多背景。
【问题讨论】:
这就是 Active Directory API 的本意。 我想到的场景类似于 psexec - 您获得了远程计算机的凭据,您将一个小型服务可执行文件复制到远程主机上的 IPC$,将其配置为远程主机,启动它并与用于执行内容的该服务建立通信。怎么可能在不接触 AD API 的情况下完成所有这些操作,但是为了查询适当的权限来执行此操作,我需要 AD API? 【参考方案1】:没有必要执行此步骤来执行您描述的任务,并且由于各种原因执行此步骤并不能确保任务成功。例如,凭据可能在远程计算机上具有权限,但可能有安全软件阻止它成功。
解决问题的方法是使用给定的凭据简单地执行任务,然后检查所有返回值。如果你得到 STATUS_ACCESS_DENIED 这意味着它所说的。如果你没有得到任何错误,那么你的工作就完成了。
检查凭据仅有助于帮助用户选择适当的凭据。您可以像检查任何其他更复杂的检查一样检查对\\machine\admin$
共享的访问。
也就是说,这就是你问的如何做
如果凭据是域凭据,则需要在 Active Directory 中查找它们。 ADSI 从脚本中对此很有用。存在其他 API。获取用户组的列表。
然后您需要使用 NetXXX api 或 ADSI WinNT 提供程序连接到远程计算机。获取管理员组的成员列表。如果用户的任何域帐户是管理员组的成员,则该用户是成员。
这一切都可以通过使用 ADSI LDAP 和 WinNT 提供程序的脚本来完成。
替代品
每个想要运行远程代码的人似乎都认为你必须编写一个服务可执行文件,安装一个服务,然后启动它。
如果您拥有管理员凭据,则非常简单的替代方法是使用任务计划程序服务。使用SCHTASKS.EXE
可以轻松创建以SYSTEM
、LOCAL SERVICE
、NETWORK SERVICE
或您拥有凭据的任何帐户运行的计划任务。它可以在没有计划的情况下创建,然后显式启动,或者使用“一次”计划在您喜欢的任何时间运行,例如在接下来的几分钟内。
如果你需要在远程机器上运行代码,我强烈推荐SCHTASKS.EXE
而不是服务方法。
【讨论】:
以上是关于win32 api - 如何检查远程机器上的用户权限的主要内容,如果未能解决你的问题,请参考以下文章
Detours简介 (拦截x86机器上的任意的win32 API函数)
使用 Win32 API 的 Windows“真实”用户列表