プログラムからファイル共有をしているPCに資格情報を送ってファイルをコピーするサンプルを掲載します。すこし応用するとネットワークドライブをプログラム上から割り当てることができます。
確認環境
- コピーするクライアントXP, ファイル共有をするサーバWindows 2003
- 作成環境: Visual Studio 2005 .NET 2.0
プログラムは次の通りです。Win32APIのWNetAddConnection2を使用していますので、必要に応じてMSDNを参照して下さい。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
namespace NetworkCredential
{
class Program
{
/// <summary>
/// ファイル共有されたファイルをローカルにコピーする
/// ただし、認証されていない場合は、WNetAddConnection2
/// で認証されてからローカルにファイルをコピーする
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
string destFilePath = @"C:\test.txt"; // コピー先のローカルパス
string sourceFilePath = @"\\sharePC\shareName\test.txt"; // コピー対象の共有されたファイルのUNCパス
string shareName = @"\\sharePC\shareName"; // 共有パス \\sparePC\C$などもOK
try
{
System.IO.File.Delete(destFilePath);
System.IO.File.Copy(sourceFilePath, destFilePath);
}
catch (IOException)
{
// エラーが出た場合は接続情報を設定
NETRESOURCE netResource = new NETRESOURCE();
netResource.dwScope = 0;
netResource.dwType = 1;
netResource.dwDisplayType = 0;
netResource.dwUsage = 0;
netResource.lpLocalName = ""; // ネットワークドライブにする場合は"z:"などドライブレター設定
netResource.lpRemoteName = shareName;
netResource.lpProvider = "";
string password = "Admin";
string userId = @"sharePC\Administrator";
int ret = 0;
try
{
ret = WNetAddConnection2(ref netResource, password, userId, 0);
}
catch (Exception)
{
}
Console.WriteLine(ret);
// もう一回だけチャレンジ
System.IO.File.Delete(destFilePath);
System.IO.File.Copy(sourceFilePath, destFilePath);
}
Console.WriteLine("終了");
Console.ReadLine();
}
[DllImport("mpr.dll", EntryPoint = "WNetAddConnection2",
CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
private static extern int WNetAddConnection2(
ref NETRESOURCE lpNetResource, string lpPassword, string lpUsername, Int32 dwFlags);
[StructLayout(LayoutKind.Sequential)]
internal struct NETRESOURCE
{
public int dwScope;
public int dwType;
public int dwDisplayType;
public int dwUsage;
[MarshalAs(UnmanagedType.LPWStr)]
public string lpLocalName;
[MarshalAs(UnmanagedType.LPWStr)]
public string lpRemoteName;
[MarshalAs(UnmanagedType.LPWStr)]
public string lpComment;
[MarshalAs(UnmanagedType.LPWStr)]
public string lpProvider;
}
}
}
WNetAddConnection2にはWNetAddConnection3などがあります。MSDNを参照して下さい。細かいパラメタもMSDNを参照すれば確認できます。
ネットワークドライブを割り当てたい場合は
netResource.lpLocalName = "Z:"
のようにすれば割り当てることができるようになります。
説明は以上です。
誤り、指摘とうがあればご連絡ください。