ローカルの名前から UNC 名を取得する方法

例えば、ローカルドライブ文字の Z: に \\servername\public という UNC シェア名をマッピングしている状況を考えます。このときに、プログラムに Z: を与え、\\servername\public を取得する方法についてご紹介します。コマンドで言えば、net use で接続一覧を表示したときに、Local から Remote を取得する操作になります。

>net use
New connections will be remembered.

Status       Local     Remote                    Network
-------------------------------------------------------------------------------
OK           Z:        \\servername\share        Microsoft Windows Network
The command completed successfully.

実はこの目的にピッタリの関数があります。WNetGetConnection です。下記にその使い方を示します (といっても、単にバッファを渡すだけなんですけど)。

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

void Usage () {
    printf (
        "Usage: getremotename drive\n"
        "ex. getremotename Q:\n");
}

int main (int argc, char* argv[]) {
    if ( argc != 2 ) {
        Usage ();
        return 0;
    }

    TCHAR szRemoteName [256];
    DWORD dwSize = sizeof ( szRemoteName );
 
    DWORD dwRet = WNetGetConnection (
        argv[1],
        szRemoteName,
        &dwSize );

    if ( NO_ERROR == dwRet ) {
        // 成功した場合は結果を表示
        _tprintf ( TEXT("Local Name:  %s\nRemote Name: %s\n"), argv[1], szRemoteName);
    }
    else {
        // ここは単にエラーメッセージを表示しているだけです。
        // net helpmsg コマンドを直接利用しています。
        _tprintf ( TEXT("ERROR %u\n"), dwRet );
        TCHAR szCommand[256];
        _stprintf (szCommand, TEXT("net helpmsg %u"), dwRet);
        _tsystem ( szCommand );
    }
  
    return 0;
}

  サンプルコードのダウンロード [getremotename.zip, makefile プロジェクト] 

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説