zoukankan      html  css  js  c++  java
  • 使用WMI来控制Windows目录 和windows共享机制

    1.使用WMI来控制Windows目录

    本文主要介绍如何使用WMI来查询目录是否存在、文件是否存在、如何建立目录、删除目录,删除文件、如何利用命令行拷贝文件,如何利用WMI拷贝文件

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Management;
    using System.Threading;
    using System.Diagnostics;
    
    namespace TJVictor.WMI
    {
        public class Win32_Directory : WMIBaseClass
        {
            #region Property
            private int timeout = 30;
            public int TimeOut
            {
                get { return timeout; }
                set { timeout = value; }
            }
            #endregion
    
            #region Construction
            public Win32_Directory()
                : base()
            {
                base.Connection();
            }
            public Win32_Directory(string domain, string Ip, string user, string psw)
                : base(domain, Ip, user, psw)
            {
                base.Connection();
            }
            #endregion
    
            #region public function
            public bool IsDirExist(string path)
            {
                string wqlSelect = "select * FROM Win32_Directory where Name='{0}'";
                if (!GetSelectQueryCollection(wqlSelect, path.Replace("//", "////")).Count.Equals(0))
                    return true;
                return false;
            }
    
            public bool IsFileExist(string path)
            {
                string wqlSelect = "select * FROM CIM_DataFile where Name='{0}'";
                if (!GetSelectQueryCollection(wqlSelect, path.Replace("//", "////")).Count.Equals(0))
                    return true;
                return false;
            }
    
            public void CreateDir(string path)
            {
                if (IsDirExist(path))
                {
                    throw new TJVictor.WMI.WmiException.DirectoryException(string.Format("无法创建 {0}, 目录已经存在",path));
                }
                ManagementClass processClass = new ManagementClass("Win32_Process");
                processClass.Scope = base.Scope;
                object[] methodArgs = { string.Format("cmd.exe /c md {0}", path), null, null, 0 };
                // Method Options
                object result = processClass.InvokeMethod("Create", methodArgs);
                CheckExceptionClass.CheckDirectoryExcepton(int.Parse(result.ToString()));
            }
    
            public void DeleteDir(string path)
            {
                if (!IsDirExist(path))
                    throw new TJVictor.WMI.WmiException.DirectoryException(string.Format("无法删除 {0}, 目录不存在",path));
                string wqlSelect = "select * FROM Win32_Directory where Name='{0}'";
                object result = 0;
                foreach (ManagementObject mo in GetSelectQueryCollection(wqlSelect, path.Replace("//", "////")))
                {
                    result = mo.InvokeMethod("Delete", null);
                    break;
                }
                CheckExceptionClass.CheckDirectoryExcepton(int.Parse(result.ToString()));
            }
    
            public void DeleteFile(string flieName)
            {
                if (!IsFileExist(flieName))
                    throw new TJVictor.WMI.WmiException.DirectoryException(string.Format("{0} 文件不存在",flieName));
                string wqlSelect = "select * FROM CIM_DataFile where Name='{0}'";
                object result = 0;
                foreach (ManagementObject mo in GetSelectQueryCollection(wqlSelect, flieName.Replace("//", "////")))
                {
                    result = mo.InvokeMethod("Delete", null);
                    break;
                }
                CheckExceptionClass.CheckDirectoryExcepton(int.Parse(result.ToString()));
            }
    
            public void CopyDirByProcess(string oldDirPath, string newDirPath)
            {
                int tempTimeOut = this.timeout;
                Process copyProcess = new Process();
                copyProcess.StartInfo.CreateNoWindow = true;
                copyProcess.StartInfo.UseShellExecute = false;
                copyProcess.StartInfo.FileName = string.Format(@"C:/WINDOWS/system32/xcopy.exe");
                copyProcess.StartInfo.Arguments = string.Format(@"/e /y {0} {1}", oldDirPath, newDirPath);
                copyProcess.Start();
                while (!copyProcess.HasExited)
                {
                    Thread.Sleep(1000);
                    copyProcess.Refresh();
                    if (tempTimeOut.Equals(0))
                        throw new WmiException.DirectoryException(string.Format("从 {0} 到 {1} 复制文件失败--{2}秒超时", oldDirPath, newDirPath, this.timeout));
                    tempTimeOut--;
                }
            }
    
            public void CopyDirByWmi(string oldDirPath, string newDirPath)
            {
                int tempTimeOut = this.timeout;
                ManagementClass processClass = new ManagementClass("Win32_Process");
                processClass.Scope = base.Scope;
    
                ManagementBaseObject mbo = processClass.GetMethodParameters("Create");
                mbo["CommandLine"] = string.Format("xcopy.exe /e /y {0} {1}", oldDirPath, newDirPath + "//*.*");
                ManagementBaseObject ob = processClass.InvokeMethod("Create", mbo, null);
    
                string wqlSelect = "select * FROM Win32_Process where ProcessID='{0}'";
                while (!GetSelectQueryCollection(wqlSelect, ob["ProcessID"].ToString()).Count.Equals(0))
                {
                    if (tempTimeOut.Equals(0))
                    {
                        throw new WmiException.DirectoryException(string.Format("从 {0} 到 {1} 拷贝文件失败----超时", oldDirPath, newDirPath));
                    }
                    tempTimeOut--;
                    Thread.Sleep(1000);
                }
            }
            #endregion
        }
    }

    2.使用WMI来操作Windows共享机制

    本文主要介绍如何使用WMI来查看共享目录是否存在、如何建立信认、如何断开信认、如何远程建立共享目录,删除共享目录

    代码如下:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Management;
    using System.Diagnostics;
    using System.Threading;
    
    namespace TJVictor.WMI
    {
        public class Win32_Share:WMIBaseClass
        {
            #region Property
            private int timeout = 30;
            public int TimeOut
            {
                get { return timeout; }
                set { timeout = value; }
            }
    
            string wqlSelect = string.Empty;
            #endregion
    
            #region Construction
            public Win32_Share()
                : base()
            {
                wqlSelect = "select * FROM Win32_Share where Name='{0}'";
                base.Connection();
            }
            public Win32_Share(string domain, string Ip, string user, string psd)
                : base(domain, Ip, user, psd)
            {
                wqlSelect = "select * FROM Win32_Share where Name='{0}'";
                base.Connection();
            }
            #endregion
    
            #region public function
            public bool IsShareDirectoryExist(string shareName)
            {
                if (!GetSelectQueryCollection(wqlSelect, shareName).Count.Equals(0))
                    return true;
                else
                    return false;
            }
    
            public void ConnectionCredit()
            {
                string creditUser = base.User;
                //判断是否为域用户
                if (!base.Domain.Equals(string.Empty))
                    creditUser = base.Domain + "//" + base.User;
    
                Process connectionCreditProcess = new Process();
                connectionCreditProcess.StartInfo.CreateNoWindow = true;
                connectionCreditProcess.StartInfo.UseShellExecute = false;
                connectionCreditProcess.StartInfo.FileName = string.Format(@"C:/WINDOWS/system32/cmd.exe");
                connectionCreditProcess.StartInfo.Arguments = string.Format("/c net use ////{0} /"{1}/" /user:/"{2}/"", base.Ip
                    , base.Password, creditUser);
                connectionCreditProcess.Start();
    
                int tempTimeout = this.timeout;
                while (!connectionCreditProcess.HasExited)
                {
                    Thread.Sleep(500);
                    connectionCreditProcess.Refresh();
                    if(tempTimeout.Equals(0))
                        throw new TJVictor.WMI.WmiException.ShareException(
                            string.Format("与{0}建立信任关系失败,建立超时",base.Ip));
                    tempTimeout--;
                }
            }
    
            public void DisconnectionCredit()
            {
                Process disconnectionCreditProcess = new Process();
                disconnectionCreditProcess.StartInfo.CreateNoWindow = true;
                disconnectionCreditProcess.StartInfo.UseShellExecute = false;
                disconnectionCreditProcess.StartInfo.FileName = string.Format(@"C:/WINDOWS/system32/cmd.exe");
                disconnectionCreditProcess.StartInfo.Arguments = string.Format(@"/c net use //{0}/ipc$ /delete", base.Ip);
                disconnectionCreditProcess.Start();
    
                int tempTimeout = this.timeout;
                while (!disconnectionCreditProcess.HasExited)
                {
                    Thread.Sleep(500);
                    disconnectionCreditProcess.Refresh();
                    if(tempTimeout.Equals(0))
                        throw new TJVictor.WMI.WmiException.ShareException(
                            string.Format("与{0}断开信任关系失败,断开超时", base.Ip));
                    tempTimeout--;
                }
            }
    
            public void CreateShareDir(string name, string shareDir)
            {
                Win32_Directory directory = new Win32_Directory(base.Domain, base.Ip, base.User, base.Password);
                if(!directory.IsDirExist(name))
                    throw new TJVictor.WMI.WmiException.ShareException(
                        string.Format("无法在{0}上建立{1}目录共享,目录不存在", base.Ip,shareDir));
    
                ManagementClass processClass = new ManagementClass("Win32_Share");
                processClass.Scope = base.Scope;
    
                string method = "Create";
                ManagementBaseObject inputArgs = processClass.GetMethodParameters(method);
                inputArgs["Name"] = name;
                inputArgs["Path"] = shareDir;
                inputArgs["Description"] = "wmi Create shared";
                inputArgs["Type"] = 0; // Disk share type
                ManagementBaseObject result = processClass.InvokeMethod(method, inputArgs, null);
                CheckExceptionClass.CheckShareException(int.Parse(result["ReturnValue"].ToString()));
    
                //检测是否已经建立共享
                int tempTimeout = this.timeout;
                while (!IsShareDirectoryExist(name))
                {
                    processClass.InvokeMethod(method, inputArgs, null);//再建立一次
                    if(tempTimeout.Equals(0))
                        throw new TJVictor.WMI.WmiException.ShareException(
                            string.Format("无法在{0}上建立{1}目录共享,建立超时", base.Ip, name));
                    tempTimeout--;
                }
            }
    
            public void DeleteShareDir(string name)
            {
                object result = 0;
                foreach (ManagementObject mo in GetSelectQueryCollection(wqlSelect,name))
                {
                    result = mo.InvokeMethod("Delete", null);
                    break;
                }
                CheckExceptionClass.CheckShareException(int.Parse(result.ToString()));
    
                //检测是否已经删除共享
                int tempTimeout = this.timeout;
                while (IsShareDirectoryExist(name))
                {
                    foreach (ManagementObject mo in GetSelectQueryCollection(wqlSelect, name))//再删除一次
                    {
                        result = mo.InvokeMethod("Delete", null);
                        break;
                    }
                    if(tempTimeout.Equals(0))
                        throw new TJVictor.WMI.WmiException.ShareException(
                             string.Format("无法在{0}上删除{1}共享,建立超时", base.Ip, name));
                    tempTimeout--;
                }
            }
            #endregion
        }
    }
  • 相关阅读:
    R语言-单一变量分析
    计算机网络和Internet之核心网络
    android Gui系统之WMS(1)----window flags & view flags
    Computer Network and Internet(1)
    android Gui系统之SurfaceFlinger(5)---Vsync(2)
    android Gui系统之SurfaceFlinger(4)---Vsync(1)
    android Gui系统之SurfaceFlinger(3)---SurfaceFlinger
    android Gui系统之SurfaceFlinger(2)---BufferQueue
    android Gui系统之SurfaceFlinger(1)---SurfaceFlinger概论
    敏捷软件开发(4)--- TEMPLATE METHOD & STRATEGY 模式
  • 原文地址:https://www.cnblogs.com/tianma3798/p/3560619.html
Copyright © 2011-2022 走看看