2013-05-01 17 views
1

不同,我有以下的代码来实现:Exec在PowerShell会返回直接运行PowerShell的

$ServiceName = $_GET['Service']; 
exec("echo . | powershell.exe -c get-service ".$ServiceName,$OutputArray); 
     echo "<pre>"; 
      print_r($OutputArray); 
     echo "</pre>"; 

$ServiceName通过GET分配,但对于这个例子。

$_GET['Service'] = "WinRM"; // Service Name is assigned to WinRM For *Windows Remote Management* 

现在。当我运行该脚本,我得到以下几点:

Array 
(
    [0] => Get-Service : Cannot find any service with service name 'WinRM'. 
    [1] => At line:1 char:12 
    [2] => + get-service <<<< WinRM 
    [3] =>  + CategoryInfo   : ObjectNotFound: (WinRM:String) [Get-Service], Se 
    [4] => rviceCommandException 
    [5] =>  + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell. 
    [6] => Commands.GetServiceCommand 
    [7] => 
) 

现在,当我打开PowerShell中并运行以下命令:

get-service WinRM我得到与返回以下输出:

PS C:\Users\Administrator> get-service WinRM 

Status Name    DisplayName 
------ ----    ----------- 
Running WinRM    Windows Remote Management (WS-Manag... 

这发生在其他一些服务名称上,例如:

$Array = array(
     "DNSServer" => "DNS", 
     "DHCP Client" => "DHCP", 
     "Web Server" => "IISADMIN", 
     "Windows Remote Management" => "WinRM" 
    ); 

这在失败中DNS, IISADMIN, WinRM这个例子......但同样,从PS我得到与返回:

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... 

我的总的问题是如何提高从PowerShell中的报告,以PHP和得到准确两端的结果?


这取决于服务名称取决于某些时间。例如: -

$ServiceName = "DHCP";这就是为什么在错误调试不包含此名称。我得到与返回:

Array 
(
    [0] => 
    [1] => Status Name    DisplayName 
    [2] => ------ ----    ----------- 
    [3] => Running DHCP    DHCP Client 
    [4] => 
    [5] => 
) 

这正是我所期待的。

回答

1

相反的PowerShell,可以考虑通过COMWMI查询机:

$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 
    ); 
} 

这将打印

Service: Dhcp - Status: OK 

可用属性win32_service时这里列出:

另一种方法是,以exec WMIC:那么$services

exec('wmic Service where name="DHCP" get name, status /format:csv', $services); 

内容将

Array 
(
    [0] => 
    [1] => Node,Name,Status 
    [2] => MYCOMPUTER,Dhcp,OK 
) 

您可以fgetcsv轻松地分析这一点。另一种易于解析的格式是rawxml而不是csv。查看http://technet.microsoft.com/en-us/library/cc757287(v=ws.10).aspx的详细信息

+0

对不起,我会在一分钟内检查一下,看看它是否有效 – 2013-05-01 15:46:41

+0

运行第一个块后,它返回空白,第二个也是如此。如果我运行'win32_service'库在PHP中,我得到错误5这是一个权限问题,我不必解决 – 2013-05-01 22:23:10

+0

对不起,不知道为什么这不适合你。这两种方法都能在我的win7机器上正常工作。 – Gordon 2013-05-02 09:06:36

相关问题