wmi e .net - Qual o erro deste código ?
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
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
Curtidas 0
Respostas
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
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
10/09/2005
up :oops:
GOSTEI 0
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
10/09/2005
Ops...isso funciona no delphi 7, agora nao nao sei no .net heim... :(
GOSTEI 0
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
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
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
Obrigado
Sanses
GOSTEI 0
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;
depois de conectar ja pode usar aquela funcao...
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
10/09/2005
Obrigado pela força Xanatos
[]´s
Sanses
[]´s
Sanses
GOSTEI 0
Sanses
10/09/2005
Encontrei uma classe em C# que realiza este processo.
Passei a classe acima para o pascal usando o babelcode, ficou assim
Mas dá erro de parametro invalido quando chamo o procedimento do objeto no form principal
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
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
10/09/2005
up :oops:
GOSTEI 0
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
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
É 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