wmi e .net - Qual o erro deste código ?

Delphi

10/09/2005

olá

var
outParams: ManagementBaseObject;
classInstance: ManagementObject;
arrComputers: string;
begin
try
arrComputers := pc;
classInstance := ManagementObject.Create((´\\´ + arrComputers + ´\root\CIMV2´), ´Win32_OperatingSystem.ReplaceKeyPropery=ReplaceKeyPropertyValue´, nil);
outParams := classInstance.InvokeMethod(´Shutdown´, nil, nil);
except
on err: ManagementException do
MessageBox.Show((´An error occurred while trying to execute the WMI method: ´
+ err.Message));
end;
end;

Este código está em .net
Alguem sabe porque este código dá erro ?
o erro é de parametro invalido


Sanses

Sanses

Curtidas 0

Respostas

Sanses

Sanses

10/09/2005

Senhores

Este código acima está errado. A função dele seria reiniciar uma máquina da rede usando WMI e .NET.

Alguem com mais esperiencia em WMI pode me ajudar neste código?

Sanses


GOSTEI 0
Sanses

Sanses

10/09/2005

up :oops:


GOSTEI 0
Xanatos

Xanatos

10/09/2005

procedure TfrmTerminal.MetodosSistemaOperacional(Objeto: string; Metodo: String);
var
  ObjProcess: SWbemObject;
  objOutParams: SWbemObject;
  ObjInParam: SWbemPrivilege;
  Text: string;
  Reason: integer;
begin
//  WmiServices.Security_.Privileges.Add(wbemPrivilegeShutdown, True);
  ObjInParam:= wmiServices.Security_.Privileges.Add(wbemPrivilegeShutdown,true);
  ObjProcess:= wmiServices.Get(Objeto,0,nil);  // objProcess:= wmiServices.Get(´Win32_process´,0,nil);
//  ObjInParam.:= ´SE_SHUTDOWN_NAME´;

  objOutParams := ObjProcess. ExecMethod_(Metodo,nil,0,nil);
  // Text vai conter uma string com o resultado do ExecMethod_ e contendo assim o ReturnValue

  Text:= objOutParams.GetObjectText_(0);
  Reason:= StrtoInt(Text[pos(´ReturnValue = ´,Text)+14]);
  Case Reason of
    0: ShowMessage(´O Método ´+Metodo+´ com sucesso!´);
    2: ShowMessage(´Acesso negado!´);
    3: ShowMessage(´Sem privilégios para esta opecar!´);
    8: ShowMessage(´Falha desconhecida!´);
    9: ShowMessage(´Caminho nao encontrado!´);
    21: ShowMessage(´Parametros Inválidos!´);
  end;
end;


Chamada: MetodosSistemaOperacional(´\\Servidor_da_Rede\ROOT\CIMV2:Win32_OperatingSystem´,´Reboot´);


GOSTEI 0
Xanatos

Xanatos

10/09/2005

Ops...isso funciona no delphi 7, agora nao nao sei no .net heim... :(


GOSTEI 0
Sanses

Sanses

10/09/2005

Olá

Xanatos, obrigado pela resposta, mais eu precisava deesta função em .NET. Vou tentar transporta-la, mas se mais alguem tiver alguma ideia de como fazer shutdown remoto com wmi e em .net, eu agradeceria muito.

[]´s
Sanses


GOSTEI 0
Sanses

Sanses

10/09/2005

xanatos, sou iniciante em WMI, e nõ consegui compilar o código que voce postou, quais as units que eu preciso declarar para que compile corretamente ?

Obrigado
Sanses


GOSTEI 0
Xanatos

Xanatos

10/09/2005

se vc ja tem a WbemScripting_TLB eu acho que nao falta nada.... se nao tem vc tem q fazer o seguinte...


1° Passo: Menu ´Project|Import type library´
2° Passo: Click em ´Add´
3° Passo: Encontre a biblioteca no caminho: C:\Windows\System32\wbem\wbemdisp.tlb
4° Passo: Click em ´Create Unit´


ai vc faz a conexao...


uses
WbemScripting_TLB;
var
wmiServices: ISWbemServices;
WbemLocator: ISWbemLocator;

procedure TForm1.Conectar;
var
  strNamespace:String;

begin
    WbemLocator:=nil;
    strNamespace:=´ROOT\CIMV2´;
    wmiServices:=nil;
    try
      try
        WbemLocator:= CoSWbemLocator.create;
      except
         showmessage(´Erro´);
      end;
    try
      wmiServices:=WbemLocator.ConnectServer(´.´, strNamespace, ´´, ´´, ´´, ´´, 0, wmiServices);
    except
    end;
    finally
     
    end;
end;


depois de conectar ja pode usar aquela funcao...


GOSTEI 0
Sanses

Sanses

10/09/2005

Obrigado pela força Xanatos

[]´s
Sanses


GOSTEI 0
Sanses

Sanses

10/09/2005

Encontrei uma classe em C# que realiza este processo.

using System; 
using System.Management; 
using System.Windows.Forms; 

namespace WMISample 
{ 
    public class CallWMIMethod 
    { 
        public static void Main() 
        { 
            try 
            { 
                ManagementObject classInstance = 
                    new ManagementObject("root\\CIMV2", 
                    "Win32_OperatingSystem.Name=´Microsoft Windows XP Professional|C:\WINDOWS|\Device\Harddisk0\Partition1´", 
                    null); 

                // no method in-parameters to define 


                // Execute the method and obtain the return values. 
                ManagementBaseObject outParams = 
                    classInstance.InvokeMethod("Shutdown", null, null); 

                // List outParams 
                Console.WriteLine("Out parameters:"); 
                Console.WriteLine("ReturnValue: " + outParams["ReturnValue"]); 
            } 
            catch(ManagementException err) 
            { 
                MessageBox.Show("An error occurred while trying to execute the WMI method: " + err.Message); 
            } 
        } 
    } 
}


Passei a classe acima para o pascal usando o babelcode, ficou assim

unit unit2; 

interface 

uses System.Management;

type 
  CallWMIMethod = class 
  public 
    class procedure Main; virtual;static; 
  end; 
  
implementation 

{$AUTOBOX ON} 
{$HINTS OFF} 
{$WARNINGS OFF} 

class procedure CallWMIMethod.Main; 
var 
  outParams: ManagementBaseObject; 
  classInstance: ManagementObject; 
begin 
  try 
    classInstance := ManagementObject.Create(´root\CIMV2´, ´Win32_OperatingSystem.ReplaceKeyPropery=´´ReplaceKeyPropertyValue´´´, nil); 
    outParams := classInstance.InvokeMethod(´Shutdown´, nil, nil); 
    Console.WriteLine(´Out parameters:´); 
    Console.WriteLine((´ReturnValue: ´ + outParams[´ReturnValue´])); 
  except 
    on err: ManagementException do 
      MessageBox.Show((´An error occurred while trying to execute the WMI method: ´ 
          + err.Message)); 
  end; 
end;


Mas dá erro de parametro invalido quando chamo o procedimento do objeto no form principal


 CallWMIMethod.Main();


Aparentemente o parametro

´Win32_OperatingSystem.ReplaceKeyPropery=´´ReplaceKeyPropertyValue´´
está errado, mais já tentei a concatenação igual é a do código em c# e não consegui.

Alguem pode ajudar ??

Sanses


GOSTEI 0
Sanses

Sanses

10/09/2005

up :oops:


GOSTEI 0
Xanatos

Xanatos

10/09/2005

Bom Sanses eu tenho um programa que faz reboot e shutdown dentre outras coisas...mas só usei delphi 7 até agora...mas vc tem que usar .net necessariamente? nao poderia criar outro programa a parte para fazer isso passando parametros e tal??


GOSTEI 0
Sanses

Sanses

10/09/2005

Oi Xanatos

É acho que vou ter que fazer isso. Tenho duas saídas : ou utilizo uma parte em .net e outra win32 como vc sugeriu, ou parto logo para C# pois nesta linguagem será mais fácil devido ao grande número de material disponível na internet.

Estou dando uma olhada no Visual Studio .net. Dependendo da minha adaptação, vou me decidir por um ou por outro. Mas desde já agradeço a sua ajuda .

Sanses


GOSTEI 0
POSTAR