プログラムからファイル共有をしている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:"
のようにすれば割り当てることができるようになります。
説明は以上です。
誤り、指摘とうがあればご連絡ください。