Fórum wmi e .net - Qual o erro deste código ? #295053
10/09/2005
0
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
Curtir tópico
+ 0Posts
11/09/2005
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
12/09/2005
Sanses
Gostei + 0
12/09/2005
Xanatos
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
12/09/2005
Xanatos
Gostei + 0
12/09/2005
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
12/09/2005
Sanses
Obrigado
Sanses
Gostei + 0
12/09/2005
Xanatos
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
12/09/2005
Sanses
[]´s
Sanses
Gostei + 0
13/09/2005
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
14/09/2005
Sanses
Gostei + 0
14/09/2005
Xanatos
Gostei + 0
14/09/2005
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
Clique aqui para fazer login e interagir na Comunidade :)