验证 Windows 用户名/密码是不是具有管理员权限
Posted
技术标签:
【中文标题】验证 Windows 用户名/密码是不是具有管理员权限【英文标题】:Validate Windows username/pwd as having Admin privs验证 Windows 用户名/密码是否具有管理员权限 【发布时间】:2014-06-19 22:05:20 【问题描述】:我正在编写一个从非特权用户帐户运行的 Windows 窗体应用程序。
对于一个操作,我需要提示输入具有管理员权限的帐户的用户名/密码。
因此,应用程序实际上不必从特权帐户运行;但是用户必须指定一个管理员帐户才能被允许执行某些操作。
有人知道如何将用户名/密码验证为具有管理员权限的帐户吗?
【问题讨论】:
您不能只提升代码的一部分以在比应用程序本身更高的权限级别上运行。如果您确实需要这样做,请将需要提升权限的代码部分放在单独的应用程序中,为其提供需要管理员权限的清单,并在需要提升权限时从您的低权限应用程序启动该应用程序。 您是想使用管理员用户的权限,还是只是确认用户名/密码组合有效且属于管理员? 我会注意到,从安全角度来看,将管理员凭据传递给非特权进程是一个坏主意。如果非特权帐户碰巧被盗,攻击者可以收集管理员凭据并使用它们来提升他的特权。正如@KenWhite所说,最好使用UAC来验证管理员用户;唯一的问题是,如果 UAC 被禁用,它将无法工作,因此您必须检测到这种情况并回退到另一个解决方案。 Re Harry 的第一个帖子问题 - 是的,我要做的就是确认用户名/密码有效且属于管理员用户。不需要在任何特权模式下实际运行任何代码。 在 Win32 代码中,您可以通过调用LogonUser
和 LOGON32_LOGON_BATCH
然后调用 CheckTokenMembership
来执行此操作。可能有一种方法可以直接在 .NET 中做同样的事情,所以希望有人可以发布答案。
【参考方案1】:
正如 Harry Johnston 所说,您可以使用以下方法来验证用户名/密码:
Private Declare Auto Function CloseHandle Lib "kernel32.dll"
(ByVal clsTokenToClose As IntPtr) As Integer
Private Declare Auto Function LogonUser Lib "advapi32.dll" ( _
ByVal lpszUsername As String, _
ByVal lpszDomain As String, _
ByVal lpszPassword As String, _
ByVal dwLogonType As Integer, _
ByVal dwLogonProvider As Integer, _
ByRef phToken As IntPtr) As Boolean
Const DOMAIN_NAME As String = "MYDOMAIN"
Dim token As IntPtr
'Use the Win32API LogonUser to authenticate UserName and Password.
'If successful, a token representing the user is returned.
If LogonUser("UserName", DOMAIN_NAME, "password", LOGON32_LOGON_BATCH,
LOGON32_PROVIDER_DEFAULT, token) Then
'The token is used to create a WindowsIdentity, which is in turn
'used to create a WindowsPrincipal. The WindowsPrincipal is checked
'to see if it belongs to the desired group in ActiveDirectory.
Dim WIdent As New WindowsIdentity(token)
Dim WPrincipal As New WindowsPrincipal(WIdent)
If WPrincipal.IsInRole("Administrators") Then
'User has admin privilege, carry on.
End If
CloseHandle(token)
End If
确保将 WPrincipal.IsInRole 调用中的“Administrators”替换为您要检查的组。
【讨论】:
非常感谢凯西。我一直在 Windows 7 Home Premium 下进行尝试;我无法识别我的具有管理员权限的帐户。但是,Harry Johnston 建议使用 LOGON32_LOGON_BATCH 的 logonType 是答案。因此,通过使用您的代码并将交互式登录更改为批处理来解决问题。非常感谢! ;-) 我已经更新了批量登录的答案并关闭了@HarryJohnston 指出的句柄。 +1。您特别需要 LOGON32_LOGON_BATCH 的原因是explained here。以上是关于验证 Windows 用户名/密码是不是具有管理员权限的主要内容,如果未能解决你的问题,请参考以下文章
它是不是需要在任何具有基本身份验证的请求中传递用户名:密码组合?
具有 Windows 身份验证的 IIS 7.5 Web 应用程序是不是要求最终用户具有文件权限?