Windows CIFS クライアントに加えて Microsoft の NFS クライアントがインストールされている Win2K8R2 システムで実行しています。
UNC パス (NFS クライアントは警告付きでサポートしています) が与えられた場合、パス上の操作が CIFS クライアントまたは NFS クライアントによって処理されるかどうかを判断できる必要があります。WNetGetResourceInformation() はこれを提供するように見えますが、UNC パスが NFS サーバーへのパスである場合、機能させることができませんでした。
サンプルコード:
int GetResourceInformation(TCHAR* path, void* buffer, DWORD* size)
{
TCHAR* p = NULL;
NETRESOURCE nr;
memset(&nr, 0, sizeof(nr));
nr.lpRemoteName = path;
DWORD dwRetVal = WNetGetResourceInformation(&nr, buffer, size, &p);
if(dwRetVal == NO_ERROR)
{
NETRESOURCE* tmp = (NETRESOURCE*)buffer;
wprintf(L"%s provider=%s system=%s\n", path, tmp->lpProvider, (p == NULL) ? L"<null>" : p);
}
else
{
wprintf(L"WNetGetResourceInformation failed for %s with error: %u\n", path, dwRetVal);
}
return dwRetVal;
}
また、ドキュメントで提案されているように、NETRESOURCE lpProvider および/または dwType フィールドに入力しようとしましたが、動作に変更はありません。
関数に CIFS UNC パスを渡すと、成功します。NFS UNC パスを渡すと、エラー 487「無効なアドレスにアクセスしようとしています。」で失敗します。また、ネイティブの NFS パス スタイルのホスト名:/export/file を渡そうとしましたが、これはエラー 67「ネットワーク名が見つかりません」で失敗します。
NFS で WNetAddConnection2() を使用するための次のサンプルを見つけましたが、このコードもエラー 50 "The request is not supported" で失敗します。「net use」コマンドまたは Microsoft が提供する NFS 固有の mount.exe ツールを使用して、エクスポートを正常にマウントできます。
最後に、WNetOpenEnum/WNetEnumResource は NFS プロバイダー情報を返さず、「net use」または mount.exe を介してマップした接続ドライブも表示しません。
私の一般的な質問は、NFS プロバイダーで WNet API を使用した方がうまくいった人はいますか? 具体的には、リモート パスのプロバイダーを決定するために使用できるメカニズムはありますか?