【发布时间】:2009-10-21 04:05:09
【问题描述】:
我想访问网络共享文件。 如何显示系统验证对话框以便用户输入用户名和密码?
ps: 通过 UNC, 在 WinForm 中。
我正在编写一个探索控件,我想在用户双击网络共享文件夹后显示对话框。
【问题讨论】:
标签: c# authentication
我想访问网络共享文件。 如何显示系统验证对话框以便用户输入用户名和密码?
ps: 通过 UNC, 在 WinForm 中。
我正在编写一个探索控件,我想在用户双击网络共享文件夹后显示对话框。
【问题讨论】:
标签: c# authentication
不确定我的理解是否正确,您想显示 Windows 身份验证对话框吗?
试试这个:
/// <summary>
/// Leverages the windows UI to prompt for a password
/// </summary>
internal static class Authentication
{
public struct CREDUI_INFO
{
public int cbSize;
public IntPtr hwndParent;
public string pszMessageText;
public string pszCaptionText;
public IntPtr hbmBanner;
}
[DllImport("credui")]
private static extern CredUIReturnCodes CredUIPromptForCredentials(ref CREDUI_INFO creditUR,
string targetName,
IntPtr reserved1,
int iError,
StringBuilder userName,
int maxUserName,
StringBuilder password,
int maxPassword,
[MarshalAs(UnmanagedType.Bool)] ref bool pfSave,
CREDUI_FLAGS flags);
[Flags]
enum CREDUI_FLAGS
{
INCORRECT_PASSWORD = 0x1,
DO_NOT_PERSIST = 0x2,
REQUEST_ADMINISTRATOR = 0x4,
EXCLUDE_CERTIFICATES = 0x8,
REQUIRE_CERTIFICATE = 0x10,
SHOW_SAVE_CHECK_BOX = 0x40,
ALWAYS_SHOW_UI = 0x80,
REQUIRE_SMARTCARD = 0x100,
PASSWORD_ONLY_OK = 0x200,
VALIDATE_USERNAME = 0x400,
COMPLETE_USERNAME = 0x800,
PERSIST = 0x1000,
SERVER_CREDENTIAL = 0x4000,
EXPECT_CONFIRMATION = 0x20000,
GENERIC_CREDENTIALS = 0x40000,
USERNAME_TARGET_CREDENTIALS = 0x80000,
KEEP_USERNAME = 0x100000,
}
public enum CredUIReturnCodes
{
NO_ERROR = 0,
ERROR_CANCELLED = 1223,
ERROR_NO_SUCH_LOGON_SESSION = 1312,
ERROR_NOT_FOUND = 1168,
ERROR_INVALID_ACCOUNT_NAME = 1315,
ERROR_INSUFFICIENT_BUFFER = 122,
ERROR_INVALID_PARAMETER = 87,
ERROR_INVALID_FLAGS = 1004,
}
/// <summary>
/// Prompts for password.
/// </summary>
/// <param name="user">The user.</param>
/// <param name="password">The password.</param>
/// <returns>True if no errors.</returns>
internal static bool PromptForPassword(out string user, out string password)
{
// Setup the flags and variables
StringBuilder userPassword = new StringBuilder(), userID = new StringBuilder();
CREDUI_INFO credUI = new CREDUI_INFO();
credUI.cbSize = Marshal.SizeOf(credUI);
bool save = false;
CREDUI_FLAGS flags = CREDUI_FLAGS.ALWAYS_SHOW_UI | CREDUI_FLAGS.GENERIC_CREDENTIALS;
// Prompt the user
CredUIReturnCodes returnCode = CredUIPromptForCredentials(ref credUI, Application.ProductName, IntPtr.Zero, 0, userID, 100, userPassword, 100, ref save, flags);
user = userID.ToString();
password = userPassword.ToString();
return (returnCode == CredUIReturnCodes.NO_ERROR);
}
}
使用通过此对话框获得的凭据,您可以按照 Phil Harding here 的说明调用 LogonUser。
【讨论】:
您目前如何访问共享?通过 UNC 还是首先将其映射到驱动器号?一种想法是使用wnetaddconnection2 api 调用和CONNECT_INTERACTIVE and CONNECT_PROMPT flags 映射它。
【讨论】:
不确定你是在做 asp.net 还是 win forms,但在 asp.net 中你会在 web.config(或 app.config 用于 winforms)中设置身份验证标签
<authentication mode="Windows"/>
<authorization>
<allow users="[Users to view that network sare]" />
</authorization>
或
<authorization>
<allow Roles="[Roles to view that network sare]" />
</authorization>
【讨论】: