WNetUseConnection で共有フォルダに接続する

プログラム内でネットワーク共有リソースに接続するには、WNetUseConnection という API を使います。
似たような API で WNetAddConnection2 や WNetAddConnection3 というのもあります。

WNetUseConnection を使うコードサンプルを書きました。

//
// 与えられた引数(共有フォルダ名)に接続する
// 成功した場合には、0 を返す
// エラーの場合には、エラー値を返す
//
DWORD MyShareFolderAccess(HWND hWnd, LPSTR lpszShareName, DWORD dwFlags = CONNECT_INTERACTIVE)
{
    // 認証用アカウント入力ダイアログを表示するには
    // CONNECT_PROMPT を dwFlags の BIT に加える。
    // dwFlags |= CONNECT_PROMPT;

    // WNet API を使い、ネットワークリソースに対して認証を行う
    NETRESOURCE nr;
    ZeroMemory(&nr, sizeof(NETRESOURCE));

    nr.dwType = RESOURCETYPE_DISK; // リソースは共有フォルダ(ディスク)
    nr.lpRemoteName = lpszShareName; // 接続する共有フォルダ名

    DWORD dwResult;
    TCHAR szAccessName[1024];
    DWORD dwBufferSize = lstrlen(lpszShareName) + sizeof(TCHAR);

    DWORD dwRes = WNetUseConnection(hWnd, &nr,
        NULL, NULL, dwFlags, szAccessName, &dwBufferSize, &dwResult);
    if (dwRes != NO_ERROR)
    {
        return dwRes;
    }

    // 必要であれば、lpszShareName と szAccessName を比較してもよい

    return 0;
}

WNetUseConnection を使って、Windows Server 2008 のネットワーク共有フォルダに接続する場合には注意が必要です。
WNet 系の API で認証を行う場合、以下の条件で 1219 (ERROR_SESSION_CREDENTIAL_CONFLICT) のエラーが発生します。

コンピューターがドメインメンバーでドメインログオンしている

かつ

認証用アカウント入力ダイアログで、ドメイン認証済みユーザーアカウントを入力する

なお、既存の OS (2003 以前)ではエラーが発生しません。
これは Windows Server 2008 ではサーバーに対するマルチログオンが禁止されているためです。
例えば、ユーザー A というドメインユーザーが PC1 でリモートデスクトップ接続でサーバーにログオンしたとします。
同じ ユーザー A が PC2 でリモートデスクトップ接続を行うと、後勝ちになり、PC1 の方はログオフしてしまいます。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。