Запрос WMI удаленно с PHP
мой текущий код выглядит так:
define ( 'CPU_NAME', 'remote_server' );
$obj = new COM ( 'winmgmts:{impersonationLevel=impersonate}//' . CPU_NAME . '/root/cimv2' );
if ( is_object ( $obj ) ){
$process = $obj->execquery ( "SELECT * FROM Win32_Process" );
}
где бы я поставил учетные данные для входа в remote_server? Я вижу, что для этого потребуется имя пользователя и пароль, но я не уверен, как это реализовать.
любая помощь будет оценили.
4 ответов
<?php
$obj = new COM ( 'winmgmts://localhost/root/CIMV2' );
$fso = new COM ( "Scripting.FileSystemObject" );
$wmi_computersystem = $obj->ExecQuery("Select * from Win32_ComputerSystem");
$wmi_bios = $obj->ExecQuery("Select * from Win32_BIOS");
$processor = $obj->ExecQuery("Select * from Win32_Processor");
$PhysicalMemory = $obj->ExecQuery("Select * from Win32_PhysicalMemory");
$BaseBoard = $obj->ExecQuery("Select * from Win32_BaseBoard");
$LogicalDisk = $obj->ExecQuery("Select * from Win32_LogicalDisk");
foreach ( $wmi_computersystem as $wmi_call )
{
$model = $wmi_call->Model;
}
foreach ( $wmi_bios as $wmi_call )
{
$serial = $wmi_call->SerialNumber;
$bios_version = $wmi_call->SMBIOSBIOSVersion;
}
foreach ( $processor as $wmi_processor )
{
$idprocessor = $wmi_processor->ProcessorId;
$Architecture = $wmi_processor->Architecture;
$Name = $wmi_processor->Name;
$Version = $wmi_processor->Version;
}
foreach ( $PhysicalMemory as $wmi_PhysicalMemory )
{
$Capacity = $wmi_PhysicalMemory->Capacity;
$PartNumber = $wmi_PhysicalMemory->PartNumber;
$Name = $wmi_PhysicalMemory->Name;
}
foreach ( $BaseBoard as $wmi_BaseBoard )
{
$SerialNumber = $wmi_BaseBoard->SerialNumber;
}
foreach ( $LogicalDisk as $wmi_LogicalDisk )
{
$SerialNumberDisk = $wmi_LogicalDisk->VolumeSerialNumber;
$FileSystem = $wmi_LogicalDisk->FileSystem;
}
echo "Bios version : ".$bios_version."<br/>
Serial number of bios : ".$serial."<br/>
Hardware Model : ".$model."<br/>
ID-Processor : ".$idprocessor."<br/>
Architecture-Processor : ".$Architecture."<br/>
Name-Processor : ".$Name."<br/>
Version-Processor : ".$Version."<br/>
<hr>
<hr>
PhysicalMemory
<hr>
<hr>
Capacity : ".$Capacity."<br/>
Name : ".$Name."<br/>
<hr>
<hr>
carte mere
<hr>
<hr>
SerialNumber : ".$SerialNumber."<br/>
<hr>
<hr>
disk
<hr>
<hr>
SerialNumber : ".$SerialNumberDisk."<br/>
FileSystem : ".$FileSystem."<br>
";
?>
подключение
для глобальных администраторов
define("NAMECOMP", 'COMP1'); // COMP1 - name or ip of local or remote computer
$WMI= new COM ( 'winmgmts:{impersonationLevel=impersonate}//'. NAMECOMP.'/root/cimv2' );
Для с логином и паролем
$objLocator = new COM("WbemScripting.SWbemLocator");
$objService = $objLocator->ConnectServer(
'ComputerName', //name/ip remote/local comp
"root\cimv2",
'login', //login remote/local comp
'password', //password remote/local comp
"MS_409",
"ntlmdomain: YourDomain" //domain remote/local comp
);
ПОЛУЧИТЬ ИНФОРМАЦИЮ
$CountCore=0;
foreach ($WMI->instancesof ( 'Win32_Processor' ) as $proc ) {
++$CountCore;
}
echo 'Count Core = ' . $CountCore;
добавить информацию о скорости и сокет процессора
$CountCore=0;
foreach ($WMI->instancesof ( 'Win32_Processor' ) as $Processor) {
++$CountCore;
$Speed=$Processor->CurrentClockSpeed;
$Socket=$Processor->SocketDesignation;
}
echo 'count core = '.$CountCore;
echo 'speed = ' . $Speed. 'Mhz';
echo 'socket = '.$Socket;
получить другую информацию просто-просто замените класс для instancesof ('Win32_Processor')
отправить Команда
if ((($_GET['Reboot']==1) OR ($_GET['Shutdown']==1))) {
define("NAMECOMP", 'COMP1');
$WMI= new COM('winmgmts:{impersonationLevel=impersonate,(Shutdown)}//'. NAMECOMP.'/root/cimv2');
foreach($WMI->instancesof('Win32_OperatingSystem') as $mp) {
if ($_GET['Reboot']==1) {
$mp->Reboot;
}
if ($_GET['Shutdown']==1) {
$mp->Shutdown;
}
}
ссылки:
<?php
$strComputer = "YOURREMOTEHOST";
$objSWbemLocator = new COM ("WbemScripting.SWbemLocator");
$objSWbemServices = $objSWbemLocator->ConnectServer($strComputer, "root\cimv2", "DOMAIN\USER", "Password");
$objSWbemServices->Security_->ImpersonationLevel = 3;
$obj = $objSWbemServices;
$fso = new COM ( "Scripting.FileSystemObject" );
//... insert your code here
//... insert your code here
?>
Я знаю, что этот поток не самый новый, но мне эта информация поможет кому-то. При попытке чтения или записи ключей реестра или установленного программного класса на удаленном компьютере необходимо передать архитектуру под запрос. Вы можете использовать что-то вроде этого.
function Connect($server = "RemotePC",$namespace = "root/CIMV2",$impersonate = 3,$Architecture = 64,$userid = null,$password = null){
try {
$wbemnvs = new COM("WbemScripting.SWbemNamedValueSet");
$wbemnvs->add("__ProviderArchitecture", $Architecture);
$wbemnvs->add("__RequiredArchitecture", true);
$wmiLocator = new COM("WbemScripting.SWbemLocator");
$this->wmiNameSpace = $wmiLocator->ConnectServer($server, $namespace, $userid, $password,null,null,128,$wbemnvs);
if($this->wmiNameSpace){
$this->ConnectedServer = $server;
}else{ return false; }
if($impersonate){
// mehr infos: http://msdn.microsoft.com/en-us/library/aa393618%28v=vs.85%29.aspx
$this->wmiNameSpace->Security_->ImpersonationLevel = $impersonate;
}
return true;
}
catch(Exception $e){
$this->wmiNameSpace = NULL;
return false;
}
}
проверьте мой wmi.класс.php at:http://scbbb.blogspot.de/2014/02/wmi-via-php.html