有办法获得进程文件的位置(文件夹)吗?

没花鹿 2013-03-26 12:56:05
找了一溜够,实在没办法

做了个抓进程的程序,突然想到这个功能能顺便捕获病毒,感觉挺有用的
...全文
198 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
并且你可以看到,使用Process类的静态 GetProcesses 等方法,可以列举所有进程。
没花鹿 2013-03-27
  • 打赏
  • 举报
回复
这样的代码要是能做到系统/补丁。。。晕。。。要回到 C++。。。?
没花鹿 2013-03-27
  • 打赏
  • 举报
回复
这段程序不建议大家试。。。想想都觉得可怕。。。
没花鹿 2013-03-27
  • 打赏
  • 举报
回复
引用 8 楼 vb763305825 的回复:
C# code?12345678910111213static void Main(string[] args) { Process p = new Process(); p.StartInfo.FileName = "notepad.exe"; p.Start(); ……
启动其他无关进程是可以的,但我要启动的是系统开机启动项,按你给的思路做了一个 ,结果要命了:


namespace CaptureProcessName.Class
{
    public class ClassProcess
    {
        private int _ProcessID = -1;//进程ID
        private string _ProcessName = "";//进程名称
        private string _ProcessFilePath = "";//文件定位

        public int ProcessID
        {
            get { return _ProcessID; }
        }
        public string ProcessName
        {
            get { return _ProcessName; }
        }
        public string ProcessFilePath
        {
            get { return _ProcessFilePath; }
        }

        public ClassProcess(string FileName)
        {
            string[] Extension = {".exe",".com",".msi" };
            bool err = false;

            Process process = new Process();
            try
            {
                process.StartInfo.FileName = FileName + Extension[0];
                process.Start();
            }
            catch { err = true; }

            if (err == true)
            {
                try
                {
                    process.StartInfo.FileName = FileName + Extension[1];
                    process.Start();
                }
                catch { err = true; }
            }

            if (err == true)
            {
                try
                {
                    process.StartInfo.FileName = FileName + Extension[2];
                    process.Start();
                }
                catch { err = true; }
            }

            if (err == false)
            {
                _ProcessID = process.Id;
                _ProcessName = process.ProcessName;
                _ProcessFilePath = process.MainModule.FileName;
            }
            else
                _ProcessFilePath = "无知类型";
        }
    }
}

[code=csharp]

        private void Form进程捕捉_Load(object sender, EventArgs e)
        {
            //遍历电脑中的进程, 并装载到 OldProcessesNameList 中
            Process[] processes = Process.GetProcesses();
            
            for (int i = 0; i < processes.GetLength(0); i++)
            {
                string s = processes[i].ProcessName;
                richTextBoxOld.Text += s + "\r\n";
                OldProcessesNameList.Add(s);
                ClassProcess p = new ClassProcess(s);
                listView1.Items.Add(p.ProcessFilePath);
            }
            label3.Text = "共计: " + processes.GetLength(0).ToString() + " 个进程";
            label4.Text = "共计: 0 个进程";
        }
[/code]
  • 打赏
  • 举报
回复
static void Main(string[] args)
{
Process p = new Process();
p.StartInfo.FileName = "notepad.exe";
p.Start();

Console.WriteLine(" 进程ID:" + p.Id);
Console.WriteLine("进程名称:" + p.ProcessName);
Console.WriteLine("文件定位:" + p.MainModule.FileName);


Console.ReadKey();
}

可以、拿到进程的MainModule.FileName属性就是了
没花鹿 2013-03-27
  • 打赏
  • 举报
回复
引用 6 楼 kansousama 的回复:
有办法,不过我没研究过。 金山的进程管理,就可以定位执行进程的那个文件并定位文件所在位置
那就说明还是有希望的
叫我三三 2013-03-27
  • 打赏
  • 举报
回复
有办法,不过我没研究过。 金山的进程管理,就可以定位执行进程的那个文件并定位文件所在位置
没花鹿 2013-03-27
  • 打赏
  • 举报
回复
想在这个基础上加入每个进程文件的文件夹位置
没花鹿 2013-03-27
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;

namespace CaptureProcessName
{
public partial class Form进程捕捉 : Form
{
private List<string> OldProcessesNameList = new List<string>();
private Thread thread搜索进程;
private bool start = false;

public Form进程捕捉()
{
InitializeComponent();
}

private void button退出_Click(object sender, EventArgs e)
{
Close();
}

private void Form进程捕捉_Load(object sender, EventArgs e)
{
//遍历电脑中的进程, 并装载到 OldProcessesNameList 中
Process[] processes = Process.GetProcesses();

for (int i = 0; i < processes.GetLength(0); i++)
{
richTextBoxOld.Text += processes[i].ProcessName + "\r\n";
OldProcessesNameList.Add(processes[i].ProcessName);
}
label3.Text = "共计: " + processes.GetLength(0).ToString() + " 个进程";
label4.Text = "共计: 0 个进程";
}

private void button开始_Click(object sender, EventArgs e)
{
button开始.Enabled = false;
button开始.Text = "恢 复";
button暂停.Enabled = true;
if (start == false)
{
start = true;
thread搜索进程 = new Thread(new ThreadStart(Run));
thread搜索进程.Priority = ThreadPriority.BelowNormal;
thread搜索进程.Start();
}
else
{
try
{
thread搜索进程.Resume();

button开始.Enabled = false;
button暂停.Enabled = true;
}
catch (ThreadStateException msg)
{
MessageBox.Show(msg.ToString(), "异常");
}
}

}

public void Run()
{
while (true)
{
int j = 0;
Process[] processes = Process.GetProcesses();

for (int i = 0; i < processes.GetLength(0); i++)
{
if (OldProcessesNameList.Contains(processes[i].ProcessName))
{
processes[i].Dispose();
}
else
{
richTextBoxNew.Text += processes[i].ProcessName + "\r\n";
OldProcessesNameList.Add(processes[i].ProcessName);
j++;
processes[i].Dispose();
}
}
label4.Text = "共计: " + j.ToString() + " 个进程" + processes.GetLength(0).ToString();

}
}

private void button暂停_Click(object sender, EventArgs e)
{
try
{
if (thread搜索进程.ThreadState == System.Threading.ThreadState.Running)
{
thread搜索进程.Suspend();//Pause the thread

button开始.Text = "继 续";
button开始.Enabled = true;
button暂停.Enabled = false;
}
}
catch(ThreadStateException msg)
{
MessageBox.Show(msg.ToString(),"异常");
}
}

private void Form进程捕捉_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
if (thread搜索进程.ThreadState == System.Threading.ThreadState.Running)
{
if (thread搜索进程.Join(1000) == false)
{
thread搜索进程.Abort();
}
}
else
{
thread搜索进程.Resume();
thread搜索进程.Suspend();
thread搜索进程.Abort();
}
}
catch
{ }
}

}
}


阿怅 2013-03-27
  • 打赏
  • 举报
回复
可以获取的


Task task = taskFactory.StartNew(() => {
this.listBoxControl1.BeginInvoke((MethodInvoker)delegate {

this.listBoxControl1.Items.Clear();

Process[] processes = Process.GetProcesses();
foreach (var item in processes)
{
this.listBoxControl1.Items.Add(item.ProcessName);
try
{
this.listBoxControl1.Items.Add( item.MainModule.FileName.Substring(0, item.MainModule.FileName.LastIndexOf("\\")));
}
catch (Win32Exception)
{
continue;
}
}

});
});


http://msdn.microsoft.com/zh-cn/library/system.diagnostics.processmodule(v=vs.100).aspx

ProcessModule.FileName 获取模块的完整路径, 在截取一下就可以了

没花鹿 2013-03-26
  • 打赏
  • 举报
回复
貌似没有办法?

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧