2009-10-20 24 views
5

Me gustaría acceder a los archivos compartidos de red. ¿Cómo se muestra el cuadro de diálogo de autenticación del sistema para que el usuario pueda ingresar el nombre de usuario y la contraseña?Cómo mostrar el cuadro de diálogo de autenticación en C# .Net 3.5 SP1

ps: A través de UNC, En WinForm.

Estoy escribiendo un control de exploración, me gustaría mostrar el cuadro de diálogo después de que el usuario haga doble clic en una carpeta compartida de red.

Respuesta

0

No está seguro de si está haciendo asp.net o ganar formas, pero en asp.net se debe establecer la etiqueta de autenticación en web.config (o app.config para WinForms)

<authentication mode="Windows"/> 

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

o

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

En WinForm. Gracias. – zunyite

13

No estoy seguro si lo entiendo correctamente, ¿desea mostrar el cuadro de diálogo de autenticación de Windows?

Prueba esto:

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

con las credenciales obtenidas con este cuadro de diálogo, se puede entonces llamar a LogonUser como se explica por Phil Harding here.

+0

Quiero mostrar el cuadro de diálogo y conectarme a la carpeta de red, pero parece que CredUIPromptForCredentials solo muestra el cuadro de diálogo? gracias. – zunyite

+0

Sí, esto solo avisará al usuario. Quizás necesite el método LogonUser. Eche un vistazo a este hilo: http://objectmix.com/csharp/213292-accessing-unc-file-share-credentials.html –

+0

Una explicación más agradable: http://platinumdogs.wordpress.com/2008/10/30/net-c-impersonation-with-network-credentials/ –

Cuestiones relacionadas