2009-10-20 9 views
5

Je souhaite accéder aux fichiers partagés en réseau. Comment afficher la boîte de dialogue d'authentification du système afin que l'utilisateur puisse entrer un nom d'utilisateur et un mot de passe? Par l'intermédiaire d'UNC, Dans WinForm.Comment afficher la boîte de dialogue d'authentification en C# .Net 3.5 SP1

J'écris un contrôle explorer, je voudrais montrer la boîte de dialogue après que l'utilisateur double-clique sur un dossier partagé de réseau.

Répondre

0

Je ne sais pas si vous faites asp.net ou gagner des formes, mais en asp.net vous définissez l'étiquette d'authentification dans web.config (ou app.config pour WinForms)

<authentication mode="Windows"/> 

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

ou

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

Dans WinForm. Merci. – zunyite

13

Vous ne savez pas si je vous ai bien compris, vous voulez afficher la boîte de dialogue d'authentification Windows?

Essayez ceci:

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

En utilisant les informations d'identification obtenues avec cette boîte de dialogue, vous pouvez alors appeler LogonUser comme expliqué par Phil Harding here.

+0

Je veux afficher la boîte de dialogue et me connecter au dossier réseau, mais il semble que CredUIPromptForCredentials n'affiche que la boîte de dialogue? merci. – zunyite

+0

Oui, cela invitera simplement l'utilisateur. Vous avez peut-être besoin de la méthode LogonUser. Jetez un oeil à ce fil: http://objectmix.com/csharp/213292-accessing-unc-file-share-credentials.html –

+0

Une meilleure explication: http://platinumdogs.wordpress.com/2008/10/30/net-c-usurpation-avec-network-credentials/ –

Questions connexes