C#訪問共享目錄 得到共享目錄檔案列表和修改裡面的檔案
阿新 • • 發佈:2019-01-29
建一個IdentityScope類,並引用相應的包
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace yokohama.util { public class IdentityScope : IDisposable { // obtains user token [DllImport("advapi32.dll", SetLastError = true)] static extern bool LogonUser(string pszUsername, string pszDomain, string pszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); // closes open handes returned by LogonUser [DllImport("kernel32.dll", CharSet = CharSet.Auto)] extern static bool CloseHandle(IntPtr handle); [DllImport("Advapi32.DLL")] static extern bool ImpersonateLoggedOnUser(IntPtr hToken); [DllImport("Advapi32.DLL")] static extern bool RevertToSelf(); const int LOGON32_PROVIDER_DEFAULT = 0; const int LOGON32_LOGON_NEWCREDENTIALS = 9;//域控中的需要用:Interactive = 2 private bool disposed; public IdentityScope(string sUsername, string sDomain, string sPassword) { // initialize tokens IntPtr pExistingTokenHandle = new IntPtr(0); IntPtr pDuplicateTokenHandle = new IntPtr(0); try { // get handle to token bool bImpersonated = LogonUser(sUsername, sDomain, sPassword, LOGON32_LOGON_NEWCREDENTIALS, LOGON32_PROVIDER_DEFAULT, ref pExistingTokenHandle); if (true == bImpersonated) { if (!ImpersonateLoggedOnUser(pExistingTokenHandle)) { int nErrorCode = Marshal.GetLastWin32Error(); throw new Exception("ImpersonateLoggedOnUser error;Code=" + nErrorCode); } } else { int nErrorCode = Marshal.GetLastWin32Error(); throw new Exception("LogonUser error;Code=" + nErrorCode); } } finally { // close handle(s) if (pExistingTokenHandle != IntPtr.Zero) CloseHandle(pExistingTokenHandle); if (pDuplicateTokenHandle != IntPtr.Zero) CloseHandle(pDuplicateTokenHandle); } } protected virtual void Dispose(bool disposing) { if (!disposed) { RevertToSelf(); disposed = true; } } public void Dispose() { Dispose(true); } } }
使用方法:
private String[] findFile(String hostIp,String dirname ) { using (IdentityScope iss = new IdentityScope(username, hostIp,password)) { try { return System.IO.Directory.GetFiles(@"\\\\" + hostIp+"\\"+dirname); } catch(Exception e) { Console.WriteLine(e.Message); } return null; } } public void writeStatusFile(String hostIp, String dirname,String message) { using (IdentityScope iss = new IdentityScope(username , hostIp, password)) { String filepath = "\\\\" + hostIp + "\\" + dirname + "\\status.txt"; if (!System.IO.File.Exists(filepath)) { File.Create(filepath); } //MessageBox.Show("撮影中、少々お待ち下さい"); using (StreamWriter sw = new StreamWriter(filepath)) { sw.WriteLine("現狀撮影開始"); } } }
一個是得到檔案列表,下面那個方法是操作遠端共享檔案