按代码强制删除本地化在网络文件夹中的文件

时间:2017-07-12 14:47:23

标签: c# powershell

我有一个非常古老的winform应用程序,用户可以直接使用本地化在网络文件夹中的exe文件。

每次我想要发布新版本时,我的大问题都是。

应用程序的dll被用户锁定,我收到以下错误:

  

该进程无法访问该文件,因为该文件正被另一个文件使用   过程

(我使用其他应用发布新版本)。

我想创建一个强制删除文件的脚本,即使某些用户仍在使用该应用程序。

我不介意用什么语言写,我试过PowerShell,C#,但没有找到答案。

2 个答案:

答案 0 :(得分:0)

假设因为在您的问题中,您正在询问如何强制删除部署的程序集,这将使正在使用的应用程序意外关闭,然后...

尝试在部署之前首先杀死exe的进程。例如在c#中(未经测试/未优化,直到我有一个免费的秒,所以只是初步想法):

while(Process.GetProcessesByName("process_name").Length > 0)
{
 //keep murderizing process while they are running
 foreach (var process in Process.GetProcessesByName("whatever"))
 {
   process.Kill();
 }
}

//Should be free now to delete

答案 1 :(得分:0)

  

您好!在远程主机中,您可以尝试这样做:

How-To-Almost-Everything-In-WMI-via-C-Part-Proce

  

或者像这样(使用powershell - 在C#中添加System.Management.Automation.dll):

using System.Management.Automation;

var xs = PowerShell.Create().AddScript("(gwmi win32_process -ComputerName Host | ? {$_.name -like 'proceesname*'}).Terminate()").AddCommand("out-string");
            Collection<PSObject> results = xs.Invoke();

            foreach (var str in results)
            {


                     Console.WriteLine(str);
                     Console.ReadLine();

            }
  

或者您可以使用psexec.exe在远程PC上连接:

string queryString =
                   "SELECT Name" +
                   "  FROM Win32_Process";

                ConnectionOptions connOptions = new ConnectionOptions();

                connOptions.Username = "user@domain.local";
                connOptions.Password = "password";

                SelectQuery query = new SelectQuery(queryString);

                ManagementScope scope = new System.Management.ManagementScope(@"\\Hostname\root\CIMV2", connOptions);

                ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
                ManagementObjectCollection processes = searcher.Get();

                foreach (ManagementObject mo in processes)
                {

                    if (mo["Name"].ToString() == "mmc.exe")
                    {
                        Console.WriteLine(mo["Name"].ToString());

                        Process cmd = new Process();

                        cmd.StartInfo.FileName = "processname.exe";

                        cmd.StartInfo.RedirectStandardInput = true;
                        cmd.StartInfo.UseShellExecute = false;
                        cmd.Start();
                        cmd.StandardInput.WriteLine("psexec.exe \\\\Hostname cmd /c taskkill /IM " + mo["Name"].ToString() + " /f" );
                        cmd.WaitForExit();
                        Console.ReadKey();
                    }

                }