プロが教えるわが家の防犯対策術!

現在、C#(VisualStudio2005)で共有フォルダの認証を行い、
そのフォルダ内のファイルを読み込む処理を行ないたいと考えています。

■動作------------------------------------------------------
1.ボタン押下によってフォルダ(\\aaa)をユーザ(user)、パスワード(pass)で認証を行なう
2.ファイル(bbb.txt)の内容をメッセージボックスに出力する
3.認証を切る

■現在の実装状況--------------------------------------------
private void btnGetShareFileData_Click(object sender, EventArgs e)
{
NETRESOURCE netresource = new NETRESOURCE();
netresource.dwType = 1;
netresource.lpLocalName = null;
netresource.lpRemoteName = "\\\\aaa";
netresource.lpProvider = null;
try
{
int returnNo1 = WNetAddConnection3(IntPtr.Zero, ref netresource, "user", "pass", 0);
System.IO.StreamReader streamReader =
new System.IO.StreamReader("\\\\aaa\\bbb.txt", System.Text.Encoding.GetEncoding(932));
MessageBox.Show(streamReader.ReadToEnd());
int returnNo2 = WNetCancelConnection2("\\\\aaa", "0", true);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
[StructLayout(LayoutKind.Sequential)]
public struct NETRESOURCE
{
public int dwType;
public string lpLocalName;
public string lpRemoteName;
public string lpProvider;
}

[DllImport("mpr.dll")]
private static extern int WNetAddConnection3(
System.IntPtr hWndOwner,
ref NETRESOURCE lpNetResource,
string lpPassword,
string lpUserName,
int dwFlags
);
[DllImport("mpr.dll")]
private static extern int WNetCancelConnection2(
string lpName,
string dwFlags,
bool fForce
);
[DllImport("mpr.dll")]
private static extern int WNetAddConnection2(
ref NETRESOURCE lpNetResource,
string lpPassword,
string lpUsername,
int dwFlags
);


■結果------------------------------------------------------
WNetAddConnection3の戻り値が「487」で
System.IO.StreamReader streamReaderを実行されると
「ログオン失敗:ユーザ名を認識できないかまたはパスワードが間違っています。」
とエラーになってします。

WNetAddConnection3でのログオン自体がうまくできていないのでしょうですが、
どうすればよいのかがわかりません。
(ちなみにWNetAddConnection2でやってみても同様です)

どなたか教えていただけないでしょうか?
いろいろなページは参考にさせていただいているのですが、
知識が足らず読み解くことができないので、
できればサンプルコード等を教えていただけると助かります。

よろしくお願いいたします。

A 回答 (1件)

NETRESOURCE構造体の定義が違うからでしょう


メンバーが足りないのです

public struct NETRESOURCE
{
  public int dwScope;     // Added
  public int dwType;
  public int dwDisplayType;  // Added
  public int dwUsage;     // Added
  public string lpLocalName;
  public string lpRemoteName;
  public string lpComment;  // Added
  public string lpProvider;
}
メンバーが足りないためにAPIの中で違う場所を参照してしまうため共有資源の名前が受け取れていないのです
VS2005付属のMSDNなどで NETRESOUSE構造体を確認しましょう
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/wnet/wnet/netresource_str.htm

この回答への補足

早速のご回答、ありがとうございます。

MSDNにある「WNetAddConnection3 関数は、 構造体の上記以外のメンバを無視します。」
というのは宣言をしなくてもいいということではないのですね。

教えていただいた通りに定義をして、特に値を設定することなく実行しました。
WNetAddConnection3の戻り値が「1208」になりましたが、以降は同じエラー結果です。

また、C#で関係するかわかりませんでしたが、どこかでポインタがどうこうという内容を読んだため、
[StructLayout(LayoutKind.Sequential)]
public struct NETRESOURCE
{
public int dwScope;     // Added
public int dwType;
public int dwDisplayType;  // Added
public int dwUsage;     // Added
[MarshalAs(UnmanagedType.LPWStr)]
public string lpLocalName;
[MarshalAs(UnmanagedType.LPWStr)]
public string lpRemoteName;
[MarshalAs(UnmanagedType.LPWStr)]
public string lpComment;  // Added
[MarshalAs(UnmanagedType.LPWStr)]
public string lpProvider;
}
で実行してみたところ
WNetAddConnection3の戻り値が「67」になり、以降は同じエラー結果です。

他にはどこを気をつけたほうがいいのでしょうか?

また、WNetAddConnection3の戻り値の内容がどのようなエラーを指しているのかがわかるサイト等を教えていただけたらと思います。

以上、よろしくお願いいたします。

補足日時:2008/10/24 12:34
    • good
    • 0
この回答へのお礼

申し訳ありません。

パスワードが間違っていただけのようです。

教えていただいた構造体で正しく動作しました。

ありがとうございました。

お礼日時:2008/10/24 15:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A