2009-10-20 23 views
5

ネットワーク共有ファイルにアクセスしたいと思います。 ユーザがユーザ名とパスワードを入力できるようにシステム認証ダイアログボックスを表示するにはどうすればよいですか?C#.Net 3.5 SP1で認証ダイアログを表示する方法

ps: UNC経由で、 WinFormで。

私はエクスプローラコントロールを作成しています。ユーザがネットワーク共有フォルダをダブルクリックした後にダイアログを表示したいと思います。

答えて

2

どのように現在共有にアクセスしていますか? UNCを通じて、または最初にドライブレターにマップしますか? 1つのアイデアはCONNECT_INTERACTIVE and CONNECT_PROMPT flagswnetaddconnection2 apiコールでマップすることです。

+0

UNCを通じて、認証を試みます。 ありがとうございます。 – zunyite

0

ないあなたがasp.netをやったりフォームを獲得しているかどうかわからしかし、asp.netであなたは、web.configファイル(またはリサイズのためのapp.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

13

あなたが正しくあなたを理解しているかわからない場合は、Windows認証ダイアログを表示しますか?

これを試してみてください:フィル・ハーディングhereで説明したように

/// <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を呼び出すことができます。

+0

ダイアログを表示してネットワークフォルダに接続したいと思っていますが、CredUIPromptForCredentialsはダイアログのみを表示しているようです。 ありがとうございます。 – zunyite

+0

はい、これはユーザーにプロンプ​​トを表示するだけです。 LogonUserメソッドが必要なことがあります。このスレッドをご覧ください: http://objectmix.com/csharp/213292-accessing-unc-file-share-credentials.html –

+0

より良い説明: http://platinumdogs.wordpress.com/2008/10/30/net-c-impersonation-with-network-credentials/ –

関連する問題