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

时间:2010-05-25 14:07:46

标签: c# winforms windows

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

需要的是每当用户打开我的Windows应用程序GUI时,即使用户以管理员身份登录,它也应该对本地管理员凭据进行身份验证。

这个窗口是假冒吗?

3 个答案:

答案 0 :(得分:8)

您可以调用LogonUser API方法来检查用户名和密码 您可以看到[DllImport] here

如果您想显示标准的用户名/密码提示,可以调用CredUIPromptForCredentials API函数;另见here

修改

要检查用户是否是管理员,您可以致电CheckTokenMembership并检查该用户是否在Administrators群组。

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

您还可以使用WMI或DirectoryServices。

答案 1 :(得分:2)

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

您可能正在寻找的是用于验证身份验证信息的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
    );

答案 2 :(得分:2)

可能有点迟了但是为了实现{#3}}到C#桌面应用程序,完成以下步骤有两个步骤。

第1步:获取当前登录的用户详细信息:

这很简单。我们可以通过使用System.Security.Principal命名空间的WindowsIdentity类来实现这一点。此类提供静态方法getCurrent(),该方法返回WindowsIdentity的对象。 Bellow是您可以用来获取当前登录用户详细信息的代码。

第2步:验证用户提供的Windows凭据:

需要询问用户的域名,用户名,密码才能将这些值传递给互操作服务。 与上面相比,这有点复杂,因为我们需要使用IntropServices调用Windows API。为此,我们需要添加一个extern函数声明,然后调用该函数。以下代码将帮助您更好地理解这一点。

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 !!!");