1

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 を使用した方がうまくいった人はいますか? 具体的には、リモート パスのプロバイダーを決定するために使用できるメカニズムはありますか?

4

1 に答える 1

0

x86 または x64 としてビルドしていますか? WOW64 で x86 プロセスからの NFS 共有に対して、WNet* API が正しく機能しないようです。これは、コードを書かなくても確認できます。NFS 共有がマウントされている場合、「C:\windows\system32\net use」では表示されますが、「C:\windows\syswow64\net use」では表示されません。ファイルシステムへのアクセスは 32 ビット プロセスで問題ないように見えますが、どの API も機能しません。

x64 としてビルドされたとしても、NULL lpProvider を使用することには一貫性がありません。動作しない時間の半分は、戻る前に約 5 秒待機します。

「NFS ネットワーク」の lpProvider を使用して 1 回、「Microsoft Windows ネットワーク」を使用して 1 回、WNetGetResourceInformation を 2 回呼び出すと、一貫して動作し、即座に戻ります。

于 2012-12-05T09:50:57.520 に答える