2013-05-01 16 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

相關問題