1

次のコードを実装しました。

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

My$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";-- これが、この Name がエラー デバッグに含まれていない理由です。次のように返されます。

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

これは私が探しているものです。

4

1 に答える 1

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 で使用できるプロパティは次のとおりです。

代替手段はexecwmic です。

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

の内容は次の$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を参照してください。

于 2013-05-01T15:20:58.623 に答える