Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-05-2016
Delphi01 Delphi01 is offline
Miembro
 
Registrado: nov 2015
Ubicación: Barcelona,España
Posts: 68
Poder: 9
Delphi01 Va por buen camino
Exclamation Problema con cambiar el nombre de Equipo

Hola ,

para cambiar el nombre de PC he utilizado lo siguiente :
Código Delphi [-]
function SetComputerName(AComputerName: string): Boolean;
var
  ComputerName: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
  Size: Cardinal;
begin
  StrPCopy(ComputerName, AComputerName);
  Result := Windows.SetComputerName(ComputerName);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if SetComputerName('NewComputerName') then
    ShowMessage('Computer Name Reset Setting will be used at next startup.')
  else 
    ShowMessage('Computer Name Not Reset');
end;
pero no funcionó y me da este error :

Slack overflow

estoy utilizando delphi xe8 y parec que no acepta Windows.SetComputerName y tuve que quitar Windows
y escribir la así
Código Delphi [-]
  Result :=SetComputerName(ComputerName);

Necesito saber porqué no funcinó, o si hay otro código mejor .

Muchas gracias.

Última edición por Casimiro Notevi fecha: 26-05-2016 a las 20:05:34.
Responder Con Cita
  #2  
Antiguo 26-05-2016
rocksoft rocksoft is offline
Miembro
NULL
 
Registrado: may 2016
Posts: 71
Poder: 8
rocksoft Va por buen camino
Hola Delphi01,

eres Administrador de la computadora, el programa que ejecutas tiene derechos de admin?

Prueba a ejecutar tu aplicacion como admin.
Responder Con Cita
  #3  
Antiguo 27-05-2016
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Otra opción (siempre muy socorrida) es recurrir a WMI.

La clase Win32_ComputerSystem, nos permite obtener esa información del equipo.
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Y además entre los métodos que posee hay uno llamado Rename:
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Utilizando un código como este puedes obtener el npombre actual del equipo:

Código Delphi [-]
var
  sWbemLocator  : OLEVariant;
  sWMIService   : OLEVariant;
  sWbemObjectSet: OLEVariant;
  sWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;

 try
    CoInitialize(nil);
    try
      sWbemLocator  := CreateOleObject('WbemScripting.SWbemLocator');
      sWMIService   := sWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
      sWbemObjectSet:= sWMIService.ExecQuery('SELECT * FROM Win32_ComputerSystem','WQL');
      oEnum         := IUnknown(sWbemObjectSet._NewEnum) as IEnumVariant;
      if oEnum.Next(1, sWbemObject, iValue) = 0 then
        Edit1.Text := sWbemObject.Properties_.Item('Name').Value;
    finally
      CoUninitialize;
    end;
 except
    on E:Exception do
        ShowMessage('Error al obtener el valor; ' + E.ClassName + '-' + E.Message);
 end;


Y usando uno como este puedes cambiar el actual nombre, por uno nuevo:

Código Delphi [-]
var
  sWbemLocator:ISWbemLocator;
  sWMIService:ISWbemServices;
  FWbemObject:ISWbemObject;
  Parametros:ISWbemObject;
  res:ISWbemObject;
  param:OleVariant;
  rValue:integer;
begin
  try
    CoInitialize(nil);
    try
      sWbemLocator := CoSWbemLocator.Create;
      sWMIService := sWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '', '', '', 0, nil);
      FWbemObject := sWMIService.Get('Win32_ComputerSystem.Name="'+ Edit1.Text + '"',0,nil);
      Parametros := FWbemObject.Methods_.Item('Rename',0).InParameters.SpawnInstance_(0);
      // Asignar valores
      param := Edit2.Text;
      Parametros.Properties_.Item('Name', 0).Set_Value(param);
      param :='XXX';
      Parametros.Properties_.Item('Password', 0).Set_Value(param);
      param :='XXX';
      Parametros.Properties_.Item('UserName', 0).Set_Value(param);

      res := sWMIService.ExecMethod('Win32_ComputerSystem.Name="'+ Edit1.Text + '"', 'Rename', Parametros, 0, nil);
      rValue := res.Properties_.Item('ReturnValue',0).Get_Value;

      if (rValue = 0) then begin
        ShowMessage('Correcto');
      end
      else begin
        ShowMessage('Se ha producido un error; Resultado: ' + IntToStr(rValue));
      end;
    except
      on E:EOleException do
          Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
      on E:Exception do
          Writeln(E.Classname, ':', E.Message);
    end;
  finally
    CoUninitialize;
  end;

Pon un formulario con un par de edits y añade ese código:



Una vez que lo cambies, puedes ver el resultado en la ventana de sistema:



Debes añadir al uses:

Código Delphi [-]
uses
  Diagnostics,
  ActiveX,
  ComObj,
  WbemScripting_TLB

El ejemplo completo lo he subido al ftp.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 28-05-2016
Delphi01 Delphi01 is offline
Miembro
 
Registrado: nov 2015
Ubicación: Barcelona,España
Posts: 68
Poder: 9
Delphi01 Va por buen camino
Muchas gracias Neftalieres muy amable te agradezco mucho tu explicación tan detallada, me funcionó lo de SetComputerName pero tenia que poner Windows en uses , algo que no lo capto muy bien todavía ,
para llamar la :
Cita:
procedure TfrmMain.btnCambiarNombrePCClick(Sender: TObject);
begin
If SetComputerName(edit1.Text) Then
begin
If MessageDlg('Computer name succesfully set.' + #13#10#13#10 + 'Would you like to restart to apply changes?',mtConfirmation,[mbYes,mbNo],0) = mrYes Then
begin
WindowsExit(EWX_REBOOT or EWX_FORCE);
end;
end
Else
begin
ShowMessage('Computer name change failed.');
end;
end;
Una pregunta amigo que és la diferencia entre SetComputerName y SetComputerNameEx?
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ver las ip, nombre de equipo y session de red desde un programa delphi ljvenegas Varios 3 28-07-2008 21:00:38
Nombre del equipo jorgegetafe Varios 2 21-10-2007 15:03:36
Nombre de equipo en xp vicvil Tablas planas 7 07-05-2007 03:28:13
Nombre equipo y usuario pjmedina API de Windows 3 22-02-2007 14:36:45
¿Cómo puedo saber el nombre del equipo? Neftali [Germán.Estévez] Trucos 5 25-10-2006 21:20:55


La franja horaria es GMT +2. Ahora son las 17:08:24.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi