我想访问网络共享文件。 如何显示系统验证对话框,以便用户可以输入用户名和密码?通过UNC, 在WinForm中。如何在C#.Net 3.5 SP1中显示验证对话框
我在写一个探索控件,我想在用户双击网络共享文件夹后显示对话框。
我想访问网络共享文件。 如何显示系统验证对话框,以便用户可以输入用户名和密码?通过UNC, 在WinForm中。如何在C#.Net 3.5 SP1中显示验证对话框
我在写一个探索控件,我想在用户双击网络共享文件夹后显示对话框。
您目前如何访问共享?通过UNC还是你首先将它映射到一个驱动器号?一个想法是将其与wnetaddconnection2 api调用映射到CONNECT_INTERACTIVE and CONNECT_PROMPT flags。
不知道你在做asp.net还是赢形式,但在asp.net你设置的(或的WinForms app.config)中web.config中的认证标签
<authentication mode="Windows"/>
<authorization>
<allow users="[Users to view that network sare]" />
</authorization>
或
<authorization>
<allow Roles="[Roles to view that network sare]" />
</authorization>
在WinForm中。 谢谢。 – zunyite 2009-10-20 17:55:39
不知道如果我正确理解你,你想显示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);
}
}
使用此对话框中获得的证书,然后你可以调用LogonUser由菲尔·哈丁here解释。
我想显示对话框并连接到网络文件夹,但似乎CredUIPromptForCredentials只显示对话框? 谢谢。 – zunyite 2009-10-20 19:09:53
是的,这只会提示用户。 也许你需要LogonUser方法。看看这个主题: http://objectmix.com/csharp/213292-accessing-unc-file-share-credentials.html – 2009-10-20 19:31:44
更好的解释: http://platinumdogs.wordpress.com/2008/10/30/net-c-impersonation-with-network-credentials/ – 2009-10-20 20:05:21
通过UNC,我会尝试认证。 谢谢。 – zunyite 2009-10-20 17:55:07