问题描述
我有一个窗口服务,可以访问其他服务器上共享文件夹中的文件(使用用户名和密码)。首次启动服务时,在服务器上进行连接没有问题,但是当它循环或停止并启动窗口服务时,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 (将#修改为@)