Php Exec到Powershell的返回与直接运行到Powershell的返回不同
我实现了以下代码:Php Exec到Powershell的返回与直接运行到Powershell的返回不同,php,powershell,exec,Php,Powershell,Exec,我实现了以下代码: $ServiceName = $_GET['Service']; exec("echo . | powershell.exe -c get-service ".$ServiceName,$OutputArray); echo "<pre>"; print_r($OutputArray); echo "</pre>"; 现在。。当我运行此脚本时,会得到以下结果: PS C:\Users\Admin
$ServiceName = $_GET['Service'];
exec("echo . | powershell.exe -c get-service ".$ServiceName,$OutputArray);
echo "<pre>";
print_r($OutputArray);
echo "</pre>";
现在。。当我运行此脚本时,会得到以下结果:
PS C:\Users\Administrator> get-service WinRM
Status Name DisplayName
------ ---- -----------
Running WinRM Windows Remote Management (WS-Manag...
这会发生在其他一些服务名称上,例如:
PS C:\Users\Administrator> get-service DNS,IISADMIN,WinRM
Status Name DisplayName
------ ---- -----------
Running DNS DNS Server
Running IISADMIN IIS Admin Service
Running WinRM Windows Remote Management (WS-Manag...
在本例中,此操作在DNS、IISADMIN、WinRM上失败。。。但再一次,从PS中我得到了:
Array
(
[0] =>
[1] => Status Name DisplayName
[2] => ------ ---- -----------
[3] => Running DHCP DHCP Client
[4] =>
[5] =>
)
$wmi = new COM('WinMgmts:{impersonationLevel=impersonate}!root/cimv2');
$result = $wmi->ExecQuery('Select * from Win32_Service where Name="Dhcp"');
foreach ($result as $share) {
printf(
'Service: %s - Status: %s %s',
$share->Name,
$share->Status,
PHP_EOL
);
}
我的总体问题是如何改进从Powershell到PHP的报告,并从两端获得准确的结果
根据服务名称的不同,此操作有时会成功。例如:
$ServiceName=“DHCP”代码>--这就是错误调试中不包括此名称的原因。。我得到的回报是:
Array
(
[0] =>
[1] => Status Name DisplayName
[2] => ------ ---- -----------
[3] => Running DHCP DHCP Client
[4] =>
[5] =>
)
$wmi = new COM('WinMgmts:{impersonationLevel=impersonate}!root/cimv2');
$result = $wmi->ExecQuery('Select * from Win32_Service where Name="Dhcp"');
foreach ($result as $share) {
printf(
'Service: %s - Status: %s %s',
$share->Name,
$share->Status,
PHP_EOL
);
}
这就是我要寻找的。
代替PosikSek,考虑通过和(
)查询机器。
这会打印出来
exec('wmic Service where name="DHCP" get name, status /format:csv', $services);
Win32_服务的可用属性如下所示:
另一种选择是exec
wmic:
Array
(
[0] =>
[1] => Node,Name,Status
[2] => MYCOMPUTER,Dhcp,OK
)
然后,$services
的内容将
您可以使用fgetcsv
轻松解析这一点。另一种易于解析的格式是rawxml
,而不是csv
。请参阅详细信息< /p> 而不是PuthSek,考虑通过“和”/P>查询机器。
这会打印出来
exec('wmic Service where name="DHCP" get name, status /format:csv', $services);
Win32_服务的可用属性如下所示:
另一种选择是exec
wmic:
Array
(
[0] =>
[1] => Node,Name,Status
[2] => MYCOMPUTER,Dhcp,OK
)
然后,$services
的内容将
您可以使用fgetcsv
轻松解析这一点。另一种易于解析的格式是rawxml
,而不是csv
。有关详细信息,请参见很抱歉延迟,我将在一分钟内对此进行检查,查看它是否工作在运行第一个块后,它将返回空白,第二个块也是如此。。如果我在PHP中运行win32_服务
库,我会得到错误5,这是一个权限问题,我不必解决。对不起,我不知道为什么这对您不起作用。这两种方法在我的win7机器上都能正常工作。也许是权限错误,因为我在2008r2操作系统上?我找到了一个临时解决方案,我有一个计划任务,以正确的权限运行PowerShell,然后PHP读取一个文本文件,生成一个包含必要信息的数组。这是我的临时解决方案,因为我被卡住了;很抱歉耽搁了,我会在一分钟内检查一下,看看它是否工作。在运行第一个块之后,它返回空白,第二个块也是。。如果我在PHP中运行win32_服务
库,我会得到错误5,这是一个权限问题,我不必解决。对不起,我不知道为什么这对您不起作用。这两种方法在我的win7机器上都能正常工作。也许是权限错误,因为我在2008r2操作系统上?我找到了一个临时解决方案,我有一个计划任务,以正确的权限运行PowerShell,然后PHP读取一个文本文件,生成一个包含必要信息的数组。这是我的临时解决方案,因为我被卡住了;