2009-10-20 61 views
5

我想访问网络共享文件。 如何显示系统验证对话框,以便用户可以输入用户名和密码?通过UNC, 在WinForm中。如何在C#.Net 3.5 SP1中显示验证对话框

我在写一个探索控件,我想在用户双击网络共享文件夹后显示对话框。

回答

0

不知道你在做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> 
+0

在WinForm中。 谢谢。 – zunyite 2009-10-20 17:55:39

13

不知道如果我正确理解你,你想显示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解释。

+0

我想显示对话框并连接到网络文件夹,但似乎CredUIPromptForCredentials只显示对话框? 谢谢。 – zunyite 2009-10-20 19:09:53

+0

是的,这只会提示用户。 也许你需要LogonUser方法。看看这个主题: http://objectmix.com/csharp/213292-accessing-unc-file-share-credentials.html – 2009-10-20 19:31:44

+0

更好的解释: http://platinumdogs.wordpress.com/2008/10/30/net-c-impersonation-with-network-credentials/ – 2009-10-20 20:05:21