C# 远程创建共享目录及文件拷贝操作

using
 System;
using
 System.Collections.Generic;
using
 System.Text;
using
 System.Management;
using
 System.IO;
using
 System.Diagnostics;
using
 System.Threading;
using
 Log;
using
 System.Windows.Forms;

namespace
 BankSDS
{
    /// <summary>


    /// 注册表主键枚举

    /// </summary>


    public
 enum
 RootKey : uint

    {
        HKEY_CLASSES_ROOT = 0x80000000,
        HKEY_CURRENT_USER = 0x80000001,
        HKEY_LOCAL_MACHINE = 0x80000002,
        HKEY_USERS = 0x80000003,
        HKEY_CURRENT_CONFIG = 0x80000005
    }

    /// <summary>


    /// 端机信息结构

    /// </summary>


    public
 struct
 ServerInfo
    {
        public
 string
 ServerID;
        public
 string
 ServerSec;
        public
 string
 ServerIP;
        public
 string
 ServerUser;
        public
 string
 ServerPw;
        /// <summary>


        /// 远程推送的目标目录

        /// </summary>


        public
 string
 FolderPath;
        /// <summary>


        /// 远程共享名?

        /// </summary>


        public
 string
 ShareName;
        /// <summary>


        /// 远程推送的说明

        /// </summary>


        public
 string
 Description;
        /// <summary>


        /// 远程推送的文件集合

        /// </summary>


        public
 string
 [] strSource;
        /// <summary>


        /// 推送成功后,要设置的注册表自动启动项名称

        /// </summary>


        public
 string
 strTarget;
        /// <summary>


        /// 传送类型

        /// </summary>


        public
 int
 transType;
        public
 bool
 Result;
    }

    /// <summary>


    /// 用于WMI连接的用户信息结构

    /// </summary>


    public
 struct
 UserInfo
    {
        public
 string
 UserName;
        public
 string
 UserPW;
        public
 bool
 IsEnable;
    }

    /// <summary>


    /// WMI基本封装

    /// </summary>


    public
 class
 WmiShareFunction
    {
        public
 static
 CLog Wmilog = new
 CLog(Application.StartupPath + @"//AppLogs//Wmi.log"
);

        /// <summary>


        /// 创建远程目录

        /// </summary>


        /// <param name="scope">
ManagementScope Instance</param>


        /// <param name="DirectoryName">
要建立的目录名</param>


        /// <param name="CurrentDirectory">
根目录所在位置,缺省为C:/</param>


        /// <returns>
0表示建立成功,-1表示建立失败</returns>


        public
 static
 int
 CreateRemoteDirectory(ManagementScope scope, string
 DirectoryName, string
 CurrentDirectory)
        {
            try

            {
                string
 currentDirectory = CurrentDirectory;
                if
 (String.IsNullOrEmpty(CurrentDirectory))
                {
                    currentDirectory = @"C:/"
;
                }
                ObjectGetOptions objectGetOptions = new
 ObjectGetOptions(null
, System.TimeSpan.MaxValue, true
);
                ManagementPath managementPath = new
 ManagementPath("Win32_Process"
);

                ManagementClass processBatch = new
 ManagementClass(scope, managementPath, objectGetOptions);
                ManagementBaseObject inParams = processBatch.GetMethodParameters("Create"
);

                inParams["CommandLine"
] = @"cmd /CMd "
 + DirectoryName;
                inParams["CurrentDirectory"
] = currentDirectory;

                ManagementBaseObject outParams = null
;
                outParams = processBatch.InvokeMethod("Create"
, inParams, null
);

                Wmilog.WriteToLog("Excute CreateRemoteDirectory:"
 + outParams.ToString());
            }
            catch
 (Exception ex)
            {
                Wmilog.WriteToLog("in CreateRemoteDirectory Exception:"
 + ex.Message);
                return
 -1;
            }
            Wmilog.WriteToLog("建远程目录成功!"
);
            return
 0;
        }

        /// <summary>


        /// 在远程目标机器上创建一个注册表主键

        /// </summary>


        /// <param name="connectionScope">
ManagementScope</param>


        /// <param name="machineName">
目标机器IP</param>


        /// <param name="BaseKey">
注册表分支名</param>


        /// <param name="key">
主键名称</param>


        /// <returns>
创建成功则返回0</returns>


        public
 static
 int
 CreateRemoteKey(ManagementScope connectionScope,
                                  string
 machineName,
                                  RootKey BaseKey,
                                  string
 key)
        {
            try

            {
                ObjectGetOptions objectGetOptions = new
 ObjectGetOptions(null
, System.TimeSpan.MaxValue, true
);
                connectionScope.Path = new
 ManagementPath(@"//"
 + machineName + @"/root/DEFAULT:StdRegProv"
);
                connectionScope.Connect();
                ManagementClass registryTask = new
 ManagementClass(connectionScope,
                               new
 ManagementPath(@"DEFAULT:StdRegProv"
), objectGetOptions);
                ManagementBaseObject methodParams = registryTask.GetMethodParameters("CreateKey"
);

                methodParams["hDefKey"
] = BaseKey;
                methodParams["sSubKeyName"
] = key;

                ManagementBaseObject exitCode = registryTask.InvokeMethod("CreateKey"
,
                                                                      methodParams, null
);

                Wmilog.WriteToLog("in CreateRemoteKey:"
 + exitCode.ToString());
            }
            catch
 (ManagementException e)
            {
                Wmilog.WriteToLog("in CreateRemoteKey(ManagementException):"
 + e.Message);
                return
 -1;
            }
            Wmilog.WriteToLog("注册表主键创建成功!"
);
            return
 0;
        }

        /// <summary>


        /// 在远程目标机器上创建一个注册表键值

        /// </summary>


        /// <param name="connectionScope">
ManagementScope</param>


        /// <param name="machineName">
目标机器IP</param>


        /// <param name="BaseKey">
注册表分支名</param>


        /// <param name="key">
主键名称</param>


        /// <param name="valueName">
键值名称</param>


        /// <param name="value">
键值</param>


        /// <returns>
创建成功则返回0</returns>


        public
 static
 int
 CreateRemoteValue(ManagementScope connectionScope,
                                    string
 machineName,
                                    RootKey BaseKey,
                                    string
 key,
                                    string
 valueName,
                                    string
 value)
        {
            try

            {
                ObjectGetOptions objectGetOptions = new
 ObjectGetOptions(null
, System.TimeSpan.MaxValue, true
);
                connectionScope.Path = new
 ManagementPath(@"//"
 + machineName + @"/root/DEFAULT:StdRegProv"
);
                connectionScope.Connect();
                ManagementClass registryTask = new
 ManagementClass(connectionScope,
                               new
 ManagementPath(@"DEFAULT:StdRegProv"
), objectGetOptions);
                ManagementBaseObject methodParams = registryTask.GetMethodParameters("SetStringValue"
);

                methodParams["hDefKey"
] = BaseKey;
                methodParams["sSubKeyName"
] = key;
                methodParams["sValue"
] = value;
                methodParams["sValueName"
] = valueName;

                ManagementBaseObject exitCode = registryTask.InvokeMethod("SetStringValue"
,
                                                                         methodParams, null
);

                Wmilog.WriteToLog("in CreateRemoteValue:"
 + exitCode.ToString());
            }
            catch
 (ManagementException e)
            {
                Wmilog.WriteToLog("in CreateRemoteValue(ManagementException):"
 + e.Message);
                return
 -1;
            }
            Wmilog.WriteToLog("注册表键值写入成功!"
);
            return
 0;
        }

        /// <summary>


        /// 执行远程文件/目录推送

        /// </summary>


        /// <param name="Server">
目标地址</param>


        /// <param name="Username">
目标设备登录用户</param>


        /// <param name="Password">
目标设备登录PWD</param>


        /// <param name="FolderPath">
远程目标目录</param>


        /// <param name="ShareName">
网络共享名</param>


        /// <param name="Description">
网络共享描述</param>


        /// <param name="reginfo">
推送成功后,可以设置的注册表项名称</param>


        /// <param name="strSources">
要推送的源文件信息</param>


        /// <param name="iType">
推送类型;0表示推送文件,1表示推送目录</param>


        /// <returns>
推送成功则返回true</returns>


        public
 static
 bool
 WmiFileCopyToRemote(string
 Server,
                      string
 Username,
                      string
 Password,
                      string
 FolderPath,
                      string
 ShareName,
                      string
 Description,
                      string
 reginfo,
                      string
[] strSources,
                      int
 iType
                     )
        {
            #region 远程共享目录组合


            //远程共享名

            StringBuilder TargetDir = new
 StringBuilder();
            TargetDir.Append(@"//"
);
            TargetDir.Append(Server);
            TargetDir.Append("//"
);
            TargetDir.Append(ShareName);
            TargetDir.Append("//"
);

            #endregion


            #region 注册表值组合


            StringBuilder KeyValue = new
 StringBuilder();
            KeyValue.Append(FolderPath);
            KeyValue.Append("//"
);

            #endregion


            #region WMI连接设置


            ConnectionOptions options = new
 ConnectionOptions();
            options.Username = Username;
            options.Password = Password;

            //options.Authority = "ntdlmdomain:DOMAIN";

            options.Impersonation = ImpersonationLevel.Impersonate;
            options.EnablePrivileges = true
;
            //options.Authentication = AuthenticationLevel.Connect;

            //options.Authority

            ManagementScope scope = new
 ManagementScope(
                    ""
 + Server + "//root//cimv2"
,
                    options);
            #endregion


            try

            {
                Wmilog.WriteToLog("开始WMI连接...... "
);
                scope.Connect();
                if
 (scope.IsConnected)
                {
                    Wmilog.WriteToLog("WMI连接成功......"
);

                    Wmilog.WriteToLog("建远程目录开始......"
);
                    CreateRemoteDirectory(scope, FolderPath, ""
);
                    Wmilog.WriteToLog("建远程目录结束......"
);

                    Wmilog.WriteToLog("建远程共享目录开始......"
);
                    CreateShareNetFolder(scope, FolderPath, ShareName, Description);
                    Wmilog.WriteToLog("建远程共享目录结束......"
);

                    Wmilog.WriteToLog("连接远程共享开始......"
);
                    CreateShareNetConnect(Server, ShareName, Username, Password);
                    Wmilog.WriteToLog("连接远程共享结束......"
);

                    //通过远程共享名,向远程共享目录中拷贝文件

                    if
 (iType == 0)
                    {
                        //文件拷贝

                        Wmilog.WriteToLog("in CopyFiles:"
 + "Start"
.ToString());
                        System.Diagnostics.Debug.WriteLine("in CopyFiles:"
 + "Start"
.ToString());
                        foreach
 (string
 filename in
 strSources)
                        {
                            if
 (!String.IsNullOrEmpty(filename))
                            {
                                FileInfo fileinfo = new
 FileInfo(filename);
                                File.Copy(filename, TargetDir + fileinfo.Name, true
);
                                System.Diagnostics.Debug.WriteLine(filename + " "
 + TargetDir + fileinfo.Name);

                            }
                        }
                        KeyValue.Append(reginfo);
                        Wmilog.WriteToLog("in CopyFiles:"
 + "End"
.ToString());
                        System.Diagnostics.Debug.WriteLine("in CopyFiles:"
 + "End"
.ToString());
                    }
                    else
 if
 (iType == 1)
                    {
                        //目录拷贝

                        DirectoryInfo DirInfo = new
 DirectoryInfo(strSources[0]);
                        KeyValue.Append(DirInfo.Name);
                        KeyValue.Append("//"
);
                        KeyValue.Append(reginfo);
                        Wmilog.WriteToLog("in CopyDirectory:"
 + "Start"
.ToString());
                        System.Diagnostics.Debug.WriteLine("in CopyDirectory:"
 + "Start"
.ToString());
                        CopyDirectory(strSources[0], TargetDir + DirInfo.Name);
                        Wmilog.WriteToLog("in CopyDirectory:"
 + "End"
.ToString());
                        System.Diagnostics.Debug.WriteLine("in CopyDirectory:"
 + "End"
.ToString());
                    }

                    Wmilog.WriteToLog("断开远程共享开始"
);
                    RemoveShareNetConnect(Server, ShareName, Username, Password);
                    Wmilog.WriteToLog("断开远程共享结束"
);

                    Wmilog.WriteToLog("删除远程共享目录开始"
);
                    RemoveShareNetFolder(scope, ShareName);
                    Wmilog.WriteToLog("删除远程共享目录结束"
);

                    if
 (!String.IsNullOrEmpty(reginfo))
                    {
                        Wmilog.WriteToLog("查找或建立注册表主键开始"
);
                        CreateRemoteKey(scope, Server, RootKey.HKEY_LOCAL_MACHINE, @"Software/Microsoft/Windows/CurrentVersion/Run"
);
                        Wmilog.WriteToLog("查找或建立注册表主键结束"
);

                        Wmilog.WriteToLog("设置注册表值开始"
);
                        CreateRemoteValue(scope, Server, RootKey.HKEY_LOCAL_MACHINE, @"Software/Microsoft/Windows/CurrentVersion/Run"
, reginfo, KeyValue.ToString());
                        Wmilog.WriteToLog("设置注册表值结"
);
                    }
                }
            }
            catch
 (Exception e)
            {
                Wmilog.WriteToLog("WMI连接失败(Exception): "
 + e.Message);
                System.Diagnostics.Debug.WriteLine("in WmiFileCopyToRemote Exception:"
 + e.Message);
                return
 false
;
            }
            Wmilog.WriteToLog("WMI操作成功结束 "
);

            return
 true
;
        }

        /// <summary>


        /// 创建远程共享目录

        /// </summary>


        /// <param name="scope">
ManagementScope</param>


        /// <param name="FolderPath">
要共享的目录路径</param>


        /// <param name="ShareName">
共享名</param>


        /// <param name="Description">
网络共享文件夹的描述</param>


        /// <returns>
0表示创建成功,-1表示创建失败</returns>


        public
 static
 int
 CreateShareNetFolder(ManagementScope scope, string
 FolderPath, string
 ShareName, string
 Description)
        {
            try

            {
                //创建一个ManagementClass对像

                ManagementClass managementClass = new
 ManagementClass(scope, new
 ManagementPath("Win32_Share"
), null
);

                //创建ManagementBaseObject的输入和输出参数

                ManagementBaseObject inParams = managementClass.GetMethodParameters("Create"
);
                ManagementBaseObject outParams;

                //设置输入参数

                inParams["Description"
] = Description;
                inParams["Name"
] = ShareName;
                inParams["Path"
] = FolderPath;
                inParams["Type"
] = 0x0;//DISK_DRIVE


                //其它类型

                //DISK_DRIVE=0x0

                //PRINT_QUEUE=0x1

                //DEVICE = 0x2

                //IPC = 0x3

                //DISK_DRIVE_ADMIN = 0x80000000

                //PRINT_QUEUE_ADMIN=0x80000001

                //DEVICE_ADMIN=0x80000002

                //IPC_ADMIN=0x80000003

                //inParams["MaximunAllowed"] = intMaxConnectionsNum;


                //调用方法ManagementClass对像

                outParams = managementClass.InvokeMethod("Create"
, inParams, null
);

                Wmilog.WriteToLog("Excute ShareNetFolder Result:"
 + outParams.ToString());
                //检测方法是否调用成功

                if
 ((uint
)(outParams.Properties["RetrunValue"
].Value) != 0)
                {
                    throw
 new
 Exception("Unable to create net share directiory!"
);
                }
            }
            catch
 (Exception ex)
            {
                Wmilog.WriteToLog("创建远程共享目录失败:"
 + ex.Message);
                return
 -1;
            }
            Wmilog.WriteToLog("创建远程共享目录成功!"
);
            return
 0;
        }

        /// <summary>


        /// 移除远程共享目录

        /// </summary>


        /// <param name="scope">
ManagementScope</param>


        /// <param name="ShareName">
共享名</param>


        /// <returns>
移除成功则返回0</returns>


        public
 static
 int
 RemoveShareNetFolder(ManagementScope scope, string
 ShareName)
        {
            try

            {
                //SelectQuery selectQuery = new SelectQuery("Select * from Win32_Share Where Name = '" + ShareName + "'");

                ObjectQuery selectQuery = new
 ObjectQuery("Select * from Win32_Share Where Name = '"
 + ShareName + "'"
);
                ManagementObjectSearcher searcher = new
 ManagementObjectSearcher(scope, selectQuery);
                foreach
 (ManagementObject mo in
 searcher.Get())
                {
                    mo.InvokeMethod("Delete"
, null
, null
);
                }
                System.Diagnostics.Debug.WriteLine("in CancelShareNetFolder:"
 + ShareName);
            }
            catch
 (ManagementException me)
            {
                Wmilog.WriteToLog("移除远程共享目录失败(ManagementException):"
 + me.Message);
                return
 -1;
            }
            catch
 (Exception e)
            {
                Wmilog.WriteToLog("移除远程共享目录失败(Exception):"
 + e.Message);
                return
 -1;
            }

            Wmilog.WriteToLog("移除远程共享目录成功!"
);
            return
 0;
        }

        /// <summary>


        /// 使用net use命令远程连接目标机器,拷贝文件

        /// </summary>


        /// <param name="strSource">
源文件</param>


        /// <param name="strTarget">
目标文件</param>


        /// <param name="Server">
目标ip</param>


        /// <param name="ShareName">
远程共享名</param>


        /// <param name="Username">
远程登录用户</param>


        /// <param name="Password">
远程登录密码</param>


        /// <returns>
拷贝成功则返回0</returns>


        public
 static
 int
 FileCopy(string
 strSource, string
 strTarget, string
 Server, string
 ShareName, string
 Username, string
 Password)
        {
            Process process = new
 Process();
            try

            {

                process.StartInfo.FileName = "net.exe"
;
                process.StartInfo.Arguments = @"use //"
 + Server + @"/"
 + ShareName + " /""
 + Password + "/" /user:/""
 + Username + "/" "
;
                process.StartInfo.CreateNoWindow = true
;
                process.StartInfo.UseShellExecute = false
;
                process.Start();
                System.Diagnostics.Debug.WriteLine(process.StartInfo.FileName + " "
 + process.StartInfo.Arguments);
                process.WaitForExit();
                System.Diagnostics.Debug.WriteLine("Start Copy File....."
);
                File.Copy(strSource, strTarget, true
);
                System.Diagnostics.Debug.WriteLine("End Copy File....."
);
                process.StartInfo.Arguments = @"use //"
 + Server + @"/"
 + ShareName + " /delete"
;
                process.Start();
                process.Close();
            }
            catch
 (IOException ex)
            {
                System.Diagnostics.Debug.WriteLine("in FileCopy IOException:"
 + ex.Message);
                return
 -1;
            }
            catch
 (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("in FileCopy Exception:"
 + ex.Message);
                return
 -1;
            }
            finally

            {
                process.Dispose();
            }
            return
 0;
        }
       
        /// <summary>


        /// 通过远程共享名,递归拷贝指定目录下的所有信息到目标目录

        /// </summary>


        /// <param name="sPath">
源目录</param>


        /// <param name="dPath">
目的目录</param>


        public
 static
 void
 CopyDirectory(string
 sPath, string
 dPath)
        {
            string
[] directories = System.IO.Directory.GetDirectories(sPath);
            if
 (!System.IO.Directory.Exists(dPath))
                System.IO.Directory.CreateDirectory(dPath);
            System.IO.DirectoryInfo dir = new
 System.IO.DirectoryInfo(sPath);
            System.IO.DirectoryInfo[] dirs = dir.GetDirectories();
            CopyFile(dir, dPath);

            if
 (dirs.Length > 0)
            {
                foreach
 (System.IO.DirectoryInfo temDirectoryInfo in
 dirs)
                {
                    string
 sourceDirectoryFullName = temDirectoryInfo.FullName;
                    string
 destDirectoryFullName = sourceDirectoryFullName.Replace(sPath, dPath);
                    if
 (!System.IO.Directory.Exists(destDirectoryFullName))
                    {
                        System.IO.Directory.CreateDirectory(destDirectoryFullName);
                    }
                    CopyFile(temDirectoryInfo, destDirectoryFullName);
                    CopyDirectory(sourceDirectoryFullName, destDirectoryFullName);
                }
            }
        }

        /// <summary>


        /// 通过远程共享名,拷贝指定目录下的所有文件到目标目录

        /// </summary>


        /// <param name="path">
源路径</param>


        /// <param name="desPath">
目的路径(//targetServer//shareName//DirectoryPath)</param>


        public
 static
 void
 CopyFile(System.IO.DirectoryInfo path, string
 desPath)
        {
            string
 sourcePath = path.FullName;
            System.IO.FileInfo[] files = path.GetFiles();
            foreach
 (System.IO.FileInfo file in
 files)
            {
                string
 sourceFileFullName = file.FullName;
                string
 destFileFullName = sourceFileFullName.Replace(sourcePath, desPath);
                file.CopyTo(destFileFullName, true
);
            }
        }

        /// <summary>


        /// 用net use命令连接到远程共享目录上,创建网络共享连接

        /// </summary>


        /// <param name="Server">
目标ip</param>


        /// <param name="ShareName">
远程共享名</param>


        /// <param name="Username">
远程登录用户</param>


        /// <param name="Password">
远程登录密码</param>


        public
 static
 void
 CreateShareNetConnect(string
 Server, string
 ShareName, string
 Username, string
 Password)
        {
            Process process = new
 Process();
            process.StartInfo.FileName = "net.exe"
;
            process.StartInfo.Arguments = @"use //"
 + Server + @"/"
 + ShareName + " /""
 + Password + "/" /user:/""
 + Username + "/" "
;
            process.StartInfo.CreateNoWindow = true
;
            process.StartInfo.UseShellExecute = false
;
            process.Start();
            process.WaitForExit();
            process.Close();
            process.Dispose();
        }

        /// <summary>


        /// 用net use delete命令移除网络共享连接

        /// </summary>


        /// <param name="Server">
目标ip</param>


        /// <param name="ShareName">
远程共享名</param>


        /// <param name="Username">
远程登录用户</param>


        /// <param name="Password">
远程登录密码</param>


        public
 static
 void
 RemoveShareNetConnect(string
 Server, string
 ShareName, string
 Username, string
 Password)
        {
            //System.Diagnostics.Process.Start("net.exe", @"use //" + Server + @"/" + ShareName + " /"" + Password + "/" /user:/"" + Username + "/" ");

            Process process = new
 Process();
            process.StartInfo.FileName = "net.exe"
;
            process.StartInfo.Arguments = @"use //"
 + Server + @"/"
 + ShareName + " /delete"
;
            process.StartInfo.CreateNoWindow = true
;
            process.StartInfo.UseShellExecute = false
;
            process.Start();
            process.WaitForExit();
            process.Close();
            process.Dispose();

        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值