【问题标题】:Check if App is running on network PC检查应用程序是否在网络 PC 上运行
【发布时间】:2023-05-30 02:31:01
【问题描述】:

我有一个 C# 应用程序在某种程度上可以工作。如果计算机(给定 IP 地址)正在运行应用程序(TEKBSS.exe),我需要做的是继续执行。我怎样才能做到这一点?有人可以帮我吗?

【问题讨论】:

    标签: c#


    【解决方案1】:

    您可以通过WMI 执行此操作。您需要适当的凭据才能访问远程计算机。

    System.Management 命名空间包括从 C# 使用 WMI 的功能。

    给你:

            // Don't forget...
            // using System.Management; <-- Need to add a reference to System.Management, too.
    
            ManagementScope scope = new ManagementScope(@"\\192.168.1.73\root\cimv2");
            string query = "SELECT * FROM Win32_Process WHERE Name='TEKBSS.exe'";
            var searcher = new ManagementObjectSearcher(query);
            searcher.Scope = scope;
            bool isRunning = searcher.Get().Count > 0;
    

    范围告诉 WMI 在哪台机器上执行查询,所以不要忘记相应地更改 IP 地址。

    然后,ManagementObjectSearcher 将向机器查询名称为 TEKBSS.exe 的所有进程的列表。

    【讨论】:

    • WMI 是 Windows 管理界面。 Systems Management Server 等工具使用它来远程询问和操作机器。您可以使用 WMI 查明远程计算机上是否正在运行特定进程——这正是您想要做的。我链接到的文章显示了使用 VBScript 执行此操作的示例,但您可以从其他语言调用 WMI API。
    【解决方案2】:

    您可以使用WMI 查询远程机器上的信息,例如正在运行哪些程序。

    您需要引用System.Management.dll,并在远程计算机上拥有适当的权限才能访问 WMI。

    using System;
    using System.Linq;
    using System.Management;
    
    namespace Bling
    {
        public static void Main()
        {
            const string Host = "vmhost01";
            const string Path = (@"\\" + Host + @"\root\CIMV2");
            const string Exe = "TEKBSS.exe";
    
            var queryString = string.Format("SELECT Name FROM Win32_Process WHERE Name = '{0}'", Exe);
    
            var query = new SelectQuery(queryString);
    
            var options = new ConnectionOptions();
            options.Username = "Administrator";
            options.Password = "*";
    
            var scope = new ManagementScope(Path, options);
    
            var searcher = new ManagementObjectSearcher(scope, query);
    
            bool isRunnning = searcher.Get().Count > 0;
    
            Console.WriteLine("Is {0} running = {1}.", Exe, isRunnning);
        }
    }
    

    【讨论】:

    • 用户名和密码对我来说是个问题,因为我们在全国范围内的环境政策是远程电脑必须每个月更改密码,这是该国不同地区的通用程序将使用它连接到不同的远程 PC(运行 Tekbss 软件的 PC)
    • @Privesh 您的机器可能位于 Windows 域下。您需要专门设置一个可以访问您域中的 WMI 信息的帐户。您可以微调帐户可以访问的 WMI 信息。不过,这是系统管理员要解决的问题。
    【解决方案3】:

    查看:

    System.Diagnostics.Process
    
    Process p = new Process();
    p.StartInfo.FileName = "TEKBSS.exe";
    p.StartInfo.CreateNoWindow = true;
    p.Start();
    p.WaitForExit();
    

    编辑:

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Reflection;
    using System.Runtime;
    using System.Runtime.CompilerServices;
    using System.Security;
    
    public class MainClass
    {
        public static void Main()
        {
            Process[] allProcs = Process.GetProcesses("RemoteMachineOnYourNetwork");
            foreach (Process p in allProcs) 
               Console.WriteLine("  -> {0} - {1}", p.ProcessName, p.PeakWorkingSet64);
    
        }
    }
    

    【讨论】:

    • 他试图判断一个进程是否已经在运行,而不是启动一个新进程(根据原始问题)。
    • @Steve 查看 WaitForExit 行。这就是告诉您该过程结束的原因。是的,这只是一个建议,他也应该从 c# 开始这个过程......
    • id 想检查应用程序 (tekbss.exe) 是否正在运行,比如说 172.16.32.34
    • WaitForExit 不会告诉您进程是否在远程机器上运行。它阻止线程启动进程,直到它完成。那是非常不同的。
    • @Steve 你对 WaitForExit 的看法当然是正确的。我认为如果该进程是从主进程启动的,则可以使用它。
    【解决方案4】:

    我知道这是 .net 代码。但我不久前用它来做同样的事情。希望它能给你一个想法,我会尝试转换。只要您有权限,您就可以在代码中执行命令pushd。您可以先尝试从命令行执行,以确保可以进入。

    PushD

    //pushes into the Given Machine on the C:\ and filters for your program
    Dim sCommand as String = "pushd \\<MachineName>\C$ && tasklist.exe /FI ""IMAGENAME eq <NameOfExecutable>.exe""
    //execute command from program
    Shell("cmd.exe /c" & sCommand. AppWinStyle.Hide, True);
    

    您很可能希望在返回计算机上的目录后执行popd

    让我看看我是否可以为你转换成 C。我稍后会编辑。

    编辑

    Link to executing commands in C#

    【讨论】:

    • 我会将命令更改为:tasklist /s MachineName /FI "IMAGENAME eq WHATEVER.exe"
    • 你们在跟我说希腊语,哈哈。我刚开始使用 c#
    最近更新 更多