2009-10-20 12 views
5

Chciałbym uzyskać dostęp do udostępnionych plików sieciowych. Jak wyświetlić okno dialogowe uwierzytelniania systemu, aby użytkownik mógł wprowadzić nazwę użytkownika i hasło?Jak wyświetlić okno dialogowe uwierzytelniania w C# .Net 3.5 SP1

ps: Przez UNC, W WinForm.

Piszę kontrolę eksploracji, chcę wyświetlić okno dialogowe po podwójnym kliknięciu na folder współdzielony sieci.

Odpowiedz

0

Nie wiem, czy robisz ASP.NET lub wygrać formy, ale w ASP.NET należy ustawić znacznik uwierzytelniania w pliku web.config (lub app.config dla WinForms)

<authentication mode="Windows"/> 

    <authorization> 
     <allow users="[Users to view that network sare]" /> 
    </authorization> 

lub

<authorization> 
    <allow Roles="[Roles to view that network sare]" /> 
</authorization> 
+0

W WinForm. Dziękuję. – zunyite

13

Nie jestem pewien, czy rozumiem cię poprawnie, chcesz wyświetlić okno dialogowe uwierzytelniania systemu Windows?

Spróbuj tego:

/// <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); 
    } 
} 

Korzystanie poświadczenia uzyskane z tego okna, można następnie wywołać LogonUser jak wyjaśnił Phil Harding here.

+0

Chcę wyświetlić okno dialogowe i połączyć się z folderem sieciowym, ale wydaje się, że CredUIPromptForCredentials wyświetla tylko okno dialogowe? dziękuję. – zunyite

+0

Tak, spowoduje to tylko monit użytkownika. Może potrzebujesz metody LogonUser. Spójrz na ten wątek: http://objectmix.com/csharp/213292-accessing-unc-file-share-credentials.html –

+0

Milsze wyjaśnienie: http://platinumdogs.wordpress.com/2008/10/30/net-c-podszywanie się-w-sieci-referencje/ –

Powiązane problemy