Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Exec到Powershell的返回与直接运行到Powershell的返回不同_Php_Powershell_Exec - Fatal编程技术网

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读取一个文本文件,生成一个包含必要信息的数组。这是我的临时解决方案,因为我被卡住了;