WNetUseConnection第二次连接返回1312

问题描述

我有一个窗口服务,可以访问其他服务器上共享文件夹中的文件(使用用户名和密码)。首次启动服务时,在服务器上进行连接没有问题,但是当它循环或停止并启动窗口服务时,WNetUseConnection总是返回错误:1231。这似乎是问题所在?

下面是连接的调用:

NetworkShare.ConnectToShare(@\\192.168.XX.XXX\images,*username*,*pw*);

NetworkShare.DisconnectFromShare(@\\192.168.XX.XXX\images,true);

下面是连接的代码:

/// <summary>
/// ネットワーク接続クラス
/// </summary>
public class NetworkShare
{
    /// <summary>
    /// リモート共有に接続します
    /// </summary>
    /// <returns>成功した場合はnull、それ以外の場合はエラーメッセージ。</returns>
    public static string ConnectToShare(string uri,string username,string password)
    {
        //ネットリソースを作成し、共有に向けます
        NETRESOURCE nr = new NETRESOURCE();
        nr.dwType = RESOURCETYPE_DISK;
        nr.lpRemoteName = uri;

        //共有を作成する
        int ret = WNetUseConnection(IntPtr.Zero,nr,password,username,null,null);

        //エラーをチェックする
        if (ret == NO_ERROR)
            return null;
        else
            return GetError(ret);
    }

    /// <summary>
    /// キャッシュから共有を削除します。
    /// </summary>
    /// <returns>成功した場合はnull、それ以外の場合はエラーメッセージ。</returns>
    public static string DisconnectFromShare(string uri,bool force)
    {
        //共有を削除する
        int ret = WNetCancelConnection(uri,force);

        //エラーをチェックする
        if (ret == NO_ERROR)
            return null;
        else
            return GetError(ret);
    }

    #region P/Invoke Stuff
    /// <summary>
    /// 共有を作成する
    /// </summary>
    [DllImport("Mpr.dll")]
    private static extern int WNetUseConnection(
        IntPtr hwndOwner,NETRESOURCE lpNetResource,string lpPassword,string lpUserID,int dwFlags,string lpAccessName,string lpBufferSize,string lpResult
        );

    /// <summary>
    /// 共有を削除する
    /// </summary>
    [DllImport("Mpr.dll")]
    private static extern int WNetCancelConnection(
        string lpName,bool fForce
        );

    /// <summary>
    /// ネットリソース
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    private class NETRESOURCE
    {
        public int dwScope = 0;
        public int dwType = 0;
        public int dwDisplayType = 0;
        public int dwUsage = 0;
        public string lpLocalName = "";
        public string lpRemoteName = "";
        public string lpComment = "";
        public string lpProvider = "";
    }

    #region 定数
    /// <summary>
    /// リソースタイプディスク
    /// </summary>
    const int RESOURCETYPE_DISK = 0x00000001;

    /// <summary>
    /// 接続更新プロファイル
    /// </summary>
    const int CONNECT_UPDATE_PROFILE = 0x00000001;
    #endregion

    #region エラー
    /// <summary>
    /// エラーなし
    /// </summary>
    const int NO_ERROR = 0;

    /// <summary>
    /// アクセスが拒否されました
    /// </summary>
    const int ERROR_ACCESS_DENIED = 5;

    /// <summary>
    /// 割り当て済み
    /// </summary>
    const int ERROR_ALREADY_ASSIGNED = 85;

    /// <summary>
    /// 悪いデバイス
    /// </summary>
    const int ERROR_BAD_DEVICE = 1200;

    /// <summary>
    /// 不正なネットワーク名
    /// </summary>
    const int ERROR_BAD_NET_NAME = 67;

    /// <summary>
    /// 悪いプロバイダー
    /// </summary>
    const int ERROR_BAD_PROVIDER = 1204;

    /// <summary>
    /// キャンセル
    /// </summary>
    const int ERROR_CANCELLED = 1223;

    /// <summary>
    /// 拡張エラー
    /// </summary>
    const int ERROR_EXTENDED_ERROR = 1208;

    /// <summary>
    /// 無効なアドレス
    /// </summary>
    const int ERROR_INVALID_ADDRESS = 487;

    /// <summary>
    /// 無効なパラメーター
    /// </summary>
    const int ERROR_INVALID_PARAMETER = 87;

    /// <summary>
    /// 無効なパスワード
    /// </summary>
    const int ERROR_INVALID_PASSWORD = 1216;

    /// <summary>
    /// より多くのデータ
    /// </summary>
    const int ERROR_MORE_DATA = 234;

    /// <summary>
    /// アイテムはありません
    /// </summary>
    const int ERROR_NO_MORE_ITEMS = 259;

    /// <summary>
    /// ネットがないか悪いパス
    /// </summary>
    const int ERROR_NO_NET_OR_BAD_PATH = 1203;

    /// <summary>
    /// ネットワークなし
    /// </summary>
    const int ERROR_NO_NETWORK = 1222;

    /// <summary>
    /// セッション機密の競合
    /// </summary>
    const int ERROR_SESSION_CREDENTIAL_CONFLICT = 1219;

    /// <summary>
    /// 悪いプロファイル
    /// </summary>
    const int ERROR_BAD_PROFILE = 1206;

    /// <summary>
    /// プロファイルを開けません
    /// </summary>
    const int ERROR_CANNOT_OPEN_PROFILE = 1205;

    /// <summary>
    /// 使用中のデバイス
    /// </summary>
    const int ERROR_DEVICE_IN_USE = 2404;

    /// <summary>
    /// 接続されていません
    /// </summary>
    const int ERROR_NOT_CONNECTED = 2250;

    /// <summary>
    /// エラーファイルを開く
    /// </summary>
    const int ERROR_OPEN_FILES = 2401;

    /// <summary>
    /// エラークラス
    /// </summary>
    private struct ErrorClass
    {
        public int num;
        public string message;
        public ErrorClass(int num,string message)
        {
            this.num = num;
            this.message = message;
        }
    }

    /// <summary>
    /// エラーメッセージリスト
    /// </summary>
    private static ErrorClass[] ERROR_LIST = new ErrorClass[] {
        new ErrorClass(ERROR_ACCESS_DENIED,"エラー:アクセスが拒否されました"),new ErrorClass(ERROR_ALREADY_ASSIGNED,"エラー:割り当て済み"),new ErrorClass(ERROR_BAD_DEVICE,"エラー:不正なデバイス"),new ErrorClass(ERROR_BAD_NET_NAME,"エラー:不正なネット名"),new ErrorClass(ERROR_BAD_PROVIDER,"エラー:不正なプロバイダー"),new ErrorClass(ERROR_CANCELLED,"エラー:キャンセルされました"),new ErrorClass(ERROR_EXTENDED_ERROR,"エラー:拡張エラー"),new ErrorClass(ERROR_INVALID_ADDRESS,"エラー:無効なアドレス"),new ErrorClass(ERROR_INVALID_PARAMETER,"エラー:無効なパラメーター"),new ErrorClass(ERROR_INVALID_PASSWORD,"エラー:無効なパスワード"),new ErrorClass(ERROR_MORE_DATA,"エラー:追加データ"),new ErrorClass(ERROR_NO_MORE_ITEMS,"エラー:これ以上アイテムはありません"),new ErrorClass(ERROR_NO_NET_OR_BAD_PATH,"エラー:ネットなしまたは不良パス"),new ErrorClass(ERROR_NO_NETWORK,"エラー:ネットワークなし"),new ErrorClass(ERROR_BAD_PROFILE,"エラー:不正なプロファイル"),new ErrorClass(ERROR_CANNOT_OPEN_PROFILE,"エラー:プロファイルを開けません"),new ErrorClass(ERROR_DEVICE_IN_USE,"エラー:使用中のデバイス"),new ErrorClass(ERROR_NOT_CONNECTED,"エラー:接続されていません"),new ErrorClass(ERROR_OPEN_FILES,"エラー:ファイルを開く"),new ErrorClass(ERROR_SESSION_CREDENTIAL_CONFLICT,"エラー:資格情報の競合"),};

    /// <summary>
    /// エラーリストでエラーを取得する
    /// </summary>
    /// <param name="errNum">エラーコード</param>
    /// <returns>エラーメッセージ</returns>
    private static string GetError(int errNum)
    {
        foreach (ErrorClass er in ERROR_LIST)
        {
            if (er.num == errNum) return er.message;
        }
        return "エラー:不明," + errNum;
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...