windows下 程序里和cmd中获取/查看进程的参数的方法,打开进程

         最近在写一个进程监控管理的程序,需求是这样的:在后台监控一个名字为links.exe的进程,由于此进程会出现不定期的挂起(无响应),但有没有任何消息提示,要求写一个的程序,在后台时刻监视着links.exe进程的状态,如果发现挂起,则强制将其结束,然后重新启动一个挂掉的进程(要求参数一致)。

        难点:由于这样的进程有多个,且其带的参数不同。如:

                     links.exe  a

                     links.exe  b

                     links.exe  c

上述是命令行形式显示。这个我后来才知道。

        此进程对应的应用程序的标题名分别是:               

          links.exe[a]

                     links.exe[b]

                     links.exe[c]

       这样看起来很容易区分,但是在任务管理器中的查看他们的进程名是完全相同的。    

                     links.exe

                     links.exe

                     links.exe

   在代码中怎么区分呢,我首先想到了PID,是的,PID是可以区分不同的进程,但是,问题又来了,

    每个PID所对应的进程名字是一样的,如果,我发现PID==5080的进程挂起了,结束掉很容易,通过对应的handle就可以,

 那接下来,我要重新启动一个这样的进程,要求参数一致,怎么启动呢?

用creatProcess()创建一个新进程时,

 CreateProcess (NULL,  // No module name (use command line)
  commandline,      // Command line
  NULL,                 // Process handle not inheritable
  NULL,                // Thread handle not inheritable
  FALSE,              // Set handle inheritance to FALSE
  0,                       // No creation flags
  NULL,              // Use parent's environment block
  NULL,             // Use parent's starting directory
  &si,                 // Pointer to STARTUPINFO structure
  &pi                // Pointer to PROCESS_INFORMATION structure
);

其第二个参数commandline表示命令行参数,(如果传递了CommandLine参数,且ApplicationName参数是NULL,那么CreateProcess会尝试从CommandLine中提取ApplicationName。具体参考:http://www.programlife.net/createprocess-command-line.html)

commandline可以是这样的形式:C:\Links:\links.exe  a

其中,C:\Links:\links.exe为进程links.exe的路径;

            a为参数;

如果,我们不知道参数的名字a,仅仅知道进程的名字links.exe,怎么能够重新启动想要的进程呢。

因此,必须要获得进程所带的参数。

获得进程所带参数可用CreateRemoteThread()和ReadProcessMemory()。

具体实现代码如下:

----------------------------------------------------------------------

int WINAPI GetProcessCommandLine(DWORD dwPID, HANDLE hProcess, LPTSTR lpszCommandLine, DWORD dwByteOfSize)

{

   DWORD dwThreadId = 0;


   DWORD dwExitCode = 0;


   DWORD dwReaded = 0;


   HANDLE hThread  = ::CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)


                      GetCommandLine, NULL, 0, &dwThreadId);



if (hThread)


{


::WaitForSingleObject(hThread, INFINITE);


::GetExitCodeThread(hThread, &dwExitCode);


::ReadProcessMemory(hProcess, (LPCVOID)dwExitCode, lpszCommandLine, 

                     dwByteOfSize, &dwReaded);


}


return dwReaded;


}


int _tmain(int argc, _TCHAR* argv[])

{
    
    HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, processID ); //根据PID获取进程的handle

    TCHAR szBuffer[256] = {0};

    GetProcessCommandLine(processID hProcess, szBuffer, sizeof(szBuffer)); 

    return 0;
}
------------------------------------------------------------------------------------------------------------------------------------------

具体可参考:http://bbs.csdn.net/topics/380196754?page=1#post-397206631

==============================================================

另,在cmd中查看正在运行的进程的参数的方法如下:

(1)查看所有运行中进程的命令行参数:

在cmd中输入:

wmic  process get caption,commandline /value

 

(2)查询指定进程的命令行参数:

在cmd中输入:

wmic  process where caption="links.exe" get caption,commandline /value


================================================================

cmd中启动一个进程的方法(打开一个应用程序):

cmd 里面输入:

call   D:\QQ files\QQ

start   D:\QQ files\QQ
均可调用该应用程序!

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt无法直接打开cmd的su权限,因为Qt是一个跨平台的框架,并不依赖于Windows命令行工具。如果您想在Windows上运行一段需要管理员权限的代码,可以使用Qt的QProcess类来启动一个新的进程,然后在新的进程以管理员权限运行代码。 以下是一个简单的示例代码,演示如何使用QProcess类在Windows上以管理员权限运行一段代码: ```cpp #include <QCoreApplication> #include <QProcess> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString program = "cmd.exe"; QStringList arguments; arguments << "/c" << "echo hello" << "&&" << "pause"; QProcess process; process.setProgram(program); process.setArguments(arguments); process.setCreateProcessArgumentsModifier([](QProcess::CreateProcessArguments *args) { args->flags |= CREATE_NEW_CONSOLE; args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES; args->startupInfo->dwFlags |= STARTF_USESHOWWINDOW; args->startupInfo->wShowWindow = SW_SHOWMAXIMIZED; args->lpDesktop = (wchar_t *)L"WinSta0\\Default"; args->hStdOutput = nullptr; args->hStdError = nullptr; }); process.start("runas"); process.waitForFinished(-1); QString output = process.readAllStandardOutput(); QString error = process.readAllStandardError(); int exitCode = process.exitCode(); qDebug() << "Output:" << output; qDebug() << "Error:" << error; qDebug() << "Exit code:" << exitCode; return a.exec(); } ``` 在这个例子,我们使用QProcess类启动一个新的cmd.exe进程,并以管理员权限运行一段代码。具体来说,我们将需要运行的代码放在arguments列表,然后使用setProgram()方法设置程序名称为cmd.exe,使用setArguments()方法设置参数列表为arguments。接下来,我们使用setCreateProcessArgumentsModifier()方法设置一些进程启动选项,以确保新的进程以管理员权限运行。最后,我们使用start()方法启动进程,使用waitForFinished()方法等待进程结束,然后使用readAllStandardOutput()、readAllStandardError()和exitCode()方法获取进程的输出和退出码。 请注意,这个例子只是一个简单的演示,实际使用您可能需要根据具体的代码和权限配置进行适当的修改。另外,需要注意的是,以管理员权限运行代码可能会对系统造成不可预知的影响,因此请谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值