PR

[C#] 共有フォルダに認証してアクセスする方法

Windowsのネットワーク共有フォルダにアクセスする際、認証が必要な場合があります。

指定した資格情報で共有フォルダに接続する方法を解説します。

WNetAddConnection2 とは?

WNetAddConnection2 は Windows API の一つで、指定した資格情報を使用してネットワークリソース(共有フォルダなど)に接続するために使用されます。

必要な using ディレクティブ

まず、必要な名前空間をインポートします。

using System;
using System.Runtime.InteropServices;

WNetAddConnection2 の P/Invoke 宣言

C# から WNetAddConnection2 を使用するためには、P/Invoke を利用して API を呼び出せるように定義する必要があります。

[StructLayout(LayoutKind.Sequential)]
public struct NETRESOURCE
{
    public int dwScope;
    public int dwType;
    public int dwDisplayType;
    public int dwUsage;
    public string lpLocalName;
    public string lpRemoteName;
    public string lpComment;
    public string lpProvider;
}

public class NetworkShareAccess
{
    [DllImport("mpr.dll", CharSet = CharSet.Auto)]
    private static extern int WNetAddConnection2(
        ref NETRESOURCE lpNetResource,
        string lpPassword,
        string lpUsername,
        int dwFlags);

    [DllImport("mpr.dll", CharSet = CharSet.Auto)]
    private static extern int WNetCancelConnection2(
        string lpName,
        int dwFlags,
        bool fForce);

共有フォルダに接続するメソッド

次に、共有フォルダへ接続するためのメソッドを作成します。

    public static int ConnectToSharedFolder(string remotePath, string username, string password)
    {
        NETRESOURCE netResource = new NETRESOURCE
        {
            dwType = 1, // RESOURCETYPE_DISK
            lpRemoteName = remotePath
        };

        int result = WNetAddConnection2(ref netResource, password, username, 0);

        return result;
    }

このメソッドを呼び出すことで、認証情報を用いて共有フォルダに接続できます。

共有フォルダの切断

使用が終わったら、接続を解除することを推奨します。

    public static int DisconnectFromSharedFolder(string remotePath)
    {
        return WNetCancelConnection2(remotePath, 0, true);
    }
}

使用例

以下のコードを実行すると、共有フォルダに接続し、ファイル操作を行った後、接続を解除できます。

class Program
{
    static void Main()
    {
        string networkPath = "\\\\192.168.1.100\\SharedFolder";
        string username = "DOMAIN\\user";
        string password = "password123";

        int connectResult = NetworkShareAccess.ConnectToSharedFolder(networkPath, username, password);

        if (connectResult == 0)
        {
            Console.WriteLine("接続成功!");
            
            // ここでファイル操作を実行
            
            NetworkShareAccess.DisconnectFromSharedFolder(networkPath);
        }
        else
        {
            Console.WriteLine($"接続失敗: エラーコード {connectResult}");
        }
    }
}

まとめ

  • WNetAddConnection2 を使用して、ネットワーク共有フォルダに認証情報付きでアクセスできる。
  • 使用後は WNetCancelConnection2 を用いて適切に切断する。
  • P/Invoke を用いることで Windows API を C# で利用できる。

この方法を活用すれば、ネットワーク上のリソースにスムーズにアクセスできます。

コメント

タイトルとURLをコピーしました