如何在Windows应用程序中使用Windows身份验证?

9

如何在使用C#编写的Windows应用程序中使用Windows身份验证(本地计算机管理员用户)。

需要的是,每当用户打开我的Windows应用程序GUI时,它都应该验证本地管理员凭据,即使用户已经作为管理员登录。

这是Windows模拟吗?

3个回答

8
您可以调用LogonUser API方法来检查用户名和密码。
您可以在这里查看[DllImport]

如果您想显示标准的用户名/密码提示,则可以调用CredUIPromptForCredentials API函数;请参见此处

编辑

要检查用户是否为管理员,可以调用CheckTokenMembership并检查用户是否在Administrators组中。

或者,您可以调用NetUserGetInfo级别1,并检查usri1_priv是否为USER_PRIV_ADMIN

您还可以使用WMI或DirectoryServices。


我该如何将其限定为管理员用户?只需验证有效的本地管理员用户(而非域或任何其他本地用户)。 - Jango
你需要检查用户名是否在本地管理员组中。http://msdn.microsoft.com/en-us/library/Aa376389%28VS.85%29.aspx - SLaks
1
检查用户是否为管理员:我正在使用用户令牌(LogonUser方法的输出变量)进行操作。以下是代码:WindowsIdentity identity = new WindowsIdentity(hToken); WindowsPrincipal principal = new WindowsPrincipal(identity); return principal.IsInRole(WindowsBuiltInRole.Administrator); - Jango

5
可能有点晚了,但是要在C#桌面应用程序中实现 Windows身份验证功能 ,需要完成以下两个步骤。 第一步: 获取当前已登录用户详细信息:
这非常简单。我们可以使用System.Security.Principal命名空间的WindowsIdentity类来实现。该类提供了一个静态方法getCurrent(),返回一个WindowsIdentity对象。 下面是可以用来获取当前已登录用户详细信息的代码。 第二步: 验证用户提供的 Windows 凭据:
需要向用户询问域名、用户名和密码,并将这些值传递给Interop服务。 与上述相比,这有点复杂,因为我们需要使用InteropServices调用Windows API。为了实现这一点,我们需要添加外部函数声明,然后调用函数。下面的代码将帮助您更好地理解这一点。
bool issuccess = false;
string username = GetloggedinUserName();
if (username.ToLowerInvariant().Contains(txtUserName.Text.Trim().ToLowerInvariant()) && username.ToLowerInvariant().Contains(txtDomain.Text.Trim().ToLowerInvariant()))
    {
        issuccess = IsValidateCredentials(txtUserName.Text.Trim(), txtPwd.Text.Trim(), txtDomain.Text.Trim());
    }

if (issuccess)
    MessageBox.Show("Successfuly Login !!!");
else
    MessageBox.Show("User Name / Password / Domain is invalid !!!");

3

一种方法是如果您的用户将作为标准帐户运行,如果您将清单文件设置为以管理员身份运行,则它将始终提示输入管理员用户名和密码。

但您可能正在寻找的是LogonUser Win32 API来验证身份信息:

[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool LogonUser(
    string lpszUsername, 
    string lpszDomain, 
    string lpszPassword, 
    int dwLogonType, 
    int dwLogonProvider, 
    out IntPtr phToken
    );

我该如何将其限定为管理员用户?只需验证有效的本地管理员用户(而非域或任何其他本地用户)。 - Jango

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接