2008年12月2日火曜日

Win32でのPID取得スクリプト改良版

参考にしたものは、VBSのファイルを作成する部分があり、権限によって動作しない
場合があったので、改良してみた。オプションによりN世代親のPIDを取得できる。


@if(0)==(0) ECHO OFF
:: GetProcessId.cmd ver 1.2
:: PolymorphicScript(CMD/JSCRIPT)
:: http://scripting.cocolog-nifty.com/blog/2007/01/index.html
:: V1.1 20081127 ST(KRB)
:: V1.2 20081202 ST(KRB) replace vbs with self script cause file permission
CScript.exe //NoLogo //E:JScript "%~f0" %*
GOTO :EOF
@end
// check if sleep
if(WScript.Arguments.Named.Exists("S")) {
var wait_period;
wait_period = WScript.Arguments.Named.Item("S");
// dummy mode for make process
try{
WScript.sleep(wait_period * 1000 + 10);
}
catch(e)
{
// none
}
finally
{
WScript.Quit(0);
}
}
//
var error_level = 0;
try
{
var pGene = 0;
if(WScript.Arguments.Named.Exists("P")) {
pGene = WScript.Arguments.Named.Item("P");
}
if(WScript.Arguments.UnNamed.Length==0) {
PrintPPid(GetPID(), pGene);
//WScript.Echo(GetPPID(GetPID()));
error_level = 0;
} else if(WScript.Arguments.UnNamed.Length==1) {
PrintPPid(WScript.Arguments.Item(0), pGene);
// WScript.Echo(GetPPID(WScript.Arguments.UnNamed.Item(0)));
error_level = 0;
} else {
WScript.StdErr.WriteLine("Usage: GetProcessID.CMD [/P:n | PID]");
error_level = 2;
}
}
catch(e)
{
WScript.StdErr.WriteLine("error:" + e.message);
error_level = 1;
}
finally
{
WScript.Quit(error_level);
}

function PrintPPid(ipid, igen){
var result = ipid;
for (var i=0;i <= igen;i++){
result = GetPPID(result);
}
WScript.Echo(result);
}

function GetPID(){
var Path=WScript.ScriptFullName;
var wShell=new ActiveXObject("WScript.Shell");
var oExec=wShell.Exec('CScript.exe //B //E:Jscript "' + Path + '" /S:0');
var PID=GetPPID(oExec.ProcessID);
try{
oExec.Terminate();
}
catch(e)
{
// none
}
return PID;
}

function GetPPID(PID){
var SWbemObjectSet=GetObject("winmgmts:root/CIMV2").ExecQuery("SELECT * FROM Win32_Process WHERE ProcessID=" + PID);
if(SWbemObjectSet.Count!=1){
WScript.StdErr.WriteLine("ID " + PID + " Not Found.");
WScript.Quit(1);
}
var Processes=new Enumerator(SWbemObjectSet);
for(;!Processes.atEnd();Processes.moveNext()){
var Process=Processes.item();
return Process.ParentProcessID;
}
}

0 件のコメント: