1、如何用Delphi程序实现修改Windows用户名、机器的TCP/IP地址、子网掩码、网关和DNS服务的IP地址?
2、如何用Delphi程序实现重新启动?
谢谢大家支持!

解决方案 »

  1.   

    去看看这个帖子:
    http://expert.csdn.net/Expert/topic/1149/1149863.xml?temp=.2511408
      

  2.   

    function TerminateAllProcesses:Boolean; 
    begin 
    ExecuteFile('C:\Windows\Rundll32.exe','user,exitwindows','',0); 
    Application.Terminate; 
    end; //关机
      

  3.   

    退出系统
      function GetWinVersion: String;  var  VersionInfo : TOSVersionInfo;  OSName : String;  begin  // set the size of the record  VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );
      if Windows.GetVersionEx( VersionInfo ) then  begin  with VersionInfo do  begin  case dwPlatformId of  VER_PLATFORM_WIN32s : OSName := 'Win32s';  VER_PLATFORM_WIN32_WINDOWS : OSName := 'Windows 95';  VER_PLATFORM_WIN32_NT : OSName := 'Windows NT';  end; // case dwPlatformId  Result := OSName + ' Version ' + IntToStr( dwMajorVersion ) + '.' + IntToStr( dwMinorVersion ) +  #13#10' (Build ' + IntToStr( dwBuildNumber ) + ': ' + szCSDVersion + ')';  end; // with VersionInfo  end // if GetVersionEx  else  Result := '';  end;
      procedure ShutDown;  const  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; // Borland forgot this declaration  var  hToken : THandle;  tkp : TTokenPrivileges;  tkpo : TTokenPrivileges;  zero : DWORD;  begin  if Pos( 'Windows NT', GetWinVersion) = 1 then // we've got to do a whole buch of things  begin  zero := 0;  if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then  begin  MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );  Exit;  end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)  if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then  begin  MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );  Exit;  end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)  // SE_SHUTDOWN_NAME  if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid ) then  begin  MessageBox( 0, 'Exit Error', 'LookupPrivilegeValue() Failed', MB_OK );  Exit;  end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid )  tkp.PrivilegeCount := 1;  tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;
      AdjustTokenPrivileges( hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero );  if Boolean( GetLastError() ) then  begin  MessageBox( 0, 'Exit Error', 'AdjustTokenPrivileges() Failed', MB_OK );  Exit;  end // if Boolean( GetLastError() )  else  ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );  end // if OSVersion = 'Windows NT'  else  begin // just shut the machine down  ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );  end; // else  end;这个程序适用于所有Windows版本 
      

  4.   

    那如何用Delphi程序实现修改Windows用户名、机器的TCP/IP地址、子网掩码、网关和DNS服务的IP地址?
      

  5.   

    function TFrmChat.GetHostName: String;
    var
      Buf: Array[0..255] of char;
      GInitData: TWSADATA;
      wVerReq: Word;
    begin
      wVerReq := MakeWord(2, 0);
      WSAStartup(wVerReq, GInitData);
      Result := '';
      GetHostName(Buf, Sizeof(Buf));
      Result := StrPas(Buf);
      WSACleanup;
    end;procedure TFrmChat.Button2Click(Sender: TObject);
    begin
      showmessage(HostName);
      showmessage(LocalIP);
    end;function TFrmChat.LocalIP: String;
    Type
      TaPInAddr=array [0..10] of PInAddr;
      PaPInAddr = ^TaPInAddr;
    var
      phe: PHostEnt;
      pptr: PaPInAddr;
      Buffer: array [0..63] of char;
      i: integer;
      GInitData: TWSADATA;
    begin
      WSAStartup(MakeWord(2,0), GInitData);
      Result := '';
      GetHostName(Buffer, Sizeof(Buffer));
      phe := GetHostByName(buffer);
      if phe = nil then exit;
      pptr := PaPInAddr(phe^.h_addr_list);
      i := 0;
      while pptr^[i] <> nil do
      begin
        result := StrPas(inet_ntoa(pptr^[i]^));
        Inc(i);
      end;
      WSACleanup;
    end;
      

  6.   

    楼主会用google/baidu来搜索文章么?如果会,你就不必到这里来问问题,如果不会那还不赶快去试试
      

  7.   

    用google也好比是海底捞针呢!
      

  8.   

    unit USock;interfaceuses Windows, Winsock;
    {
      使用到WinSock2。
      这是一个完整的Delphi单元,将它加入到你的工程中,你可以调用:
      EnumInterfaces(var s string): Boolean;
      来返回所有IP地址、网络掩码、广播地址和连接状态。  此函数列举出所有的TCP/IP连接,并返回一个由回车换行(CRLF)符分隔的字符串,包含以下信息:
      IP, NetMask, BroadCast-Address, Up/Down status,
      Broadcast support, Loopback
      如果你将这个字符串赋给TMemo(它的Memo.Lines.Text属性),你可以看到更清晰的结果。
      使用此函数,你需要Win98/ME/2K, 95 OSR 2 或者NT service pack #3,
      因为程序会使用到WinSock 2(WS2_32.DLL)。}function EnumInterfaces(var sInt: string): Boolean;{从Winsock 2.0导入函数WSAIOCtl -- 在Win98/ME/2K and 95 OSR2, NT srv pack #3下才有Winsock 2}
    function WSAIoctl(s: TSocket; cmd: DWORD; lpInBuffer: PCHAR; dwInBufferLen: DWORD;
      lpOutBuffer: PCHAR; dwOutBufferLen: DWORD;
      lpdwOutBytesReturned: LPDWORD;
      lpOverLapped: POINTER;
      lpOverLappedRoutine: POINTER): Integer; stdcall; external 'WS2_32.DLL';{Constants taken from C header files}
    const
      SIO_GET_INTERFACE_LIST = $4004747F;
      IFF_UP = $00000001;
      IFF_BROADCAST = $00000002;
      IFF_LOOPBACK = $00000004;
      IFF_POINTTOPOINT = $00000008;
      IFF_MULTICAST = $00000010;type
      sockaddr_gen = packed record
        AddressIn: sockaddr_in;
        filler: packed array[0..7] of char;
      end;type
      INTERFACE_INFO = packed record
        iiFlags: u_long;                                        // Interface flags
        iiAddress: sockaddr_gen;                                // Interface address
        iiBroadcastAddress: sockaddr_gen;                       // Broadcast address
        iiNetmask: sockaddr_gen;                                // Network mask
      end;implementation{
      1. 打开Winsock
      2. 创建一个socket
      3. 调用WSAIOCtl获取网络连接
      4. 对每个连接,获取它的IP、掩码、广播地址、状态
      5. 将信息填充到一个由CDLF分隔的字符串中
      6. 结束}function EnumInterfaces(var sInt: string): Boolean;
    var
      s: TSocket;
      wsaD: WSADATA;
      NumInterfaces: Integer;
      BytesReturned, SetFlags: u_long;
      pAddrInet: SOCKADDR_IN;
      pAddrString: PCHAR;
      PtrA: pointer;
      Buffer: array[0..20] of INTERFACE_INFO;
      i: Integer;
    begin
      result := true;                                           // Initialize
      sInt := '';
      WSAStartup($0101, wsaD);                                  // Start WinSock
      // You should normally check
      // for errors here :)
      s := Socket(AF_INET, SOCK_STREAM, 0);                     // Open a socket
      if (s = INVALID_SOCKET) then exit;  try                                                       // Call WSAIoCtl
        PtrA := @bytesReturned;
        if (WSAIoCtl(s, SIO_GET_INTERFACE_LIST, nil, 0, @Buffer, 1024, PtrA, nil,
          nil)
          <> SOCKET_ERROR) then
        begin                                                   // If ok, find out how
      // many interfaces exist      NumInterfaces := BytesReturned div SizeOf(INTERFACE_INFO);      for i := 0 to NumInterfaces - 1 do                    // For every interface
          begin
            pAddrInet := Buffer[i].iiAddress.addressIn;         // IP ADDRESS
            pAddrString := inet_ntoa(pAddrInet.sin_addr);
            sInt := sInt + ' IP=' + pAddrString + ',';
            pAddrInet := Buffer[i].iiNetMask.addressIn;         // SUBNET MASK
            pAddrString := inet_ntoa(pAddrInet.sin_addr);
            sInt := sInt + ' Mask=' + pAddrString + ',';
            pAddrInet := Buffer[i].iiBroadCastAddress.addressIn; // Broadcast addr
            pAddrString := inet_ntoa(pAddrInet.sin_addr);
            sInt := sInt + ' Broadcast=' + pAddrString + ',';        SetFlags := Buffer[i].iiFlags;
            if (SetFlags and IFF_UP) = IFF_UP then
              sInt := sInt + ' Interface UP,'                   // Interface up/down
            else
              sInt := sInt + ' Interface DOWN,';        if (SetFlags and IFF_BROADCAST) = IFF_BROADCAST then // Broadcasts
              sInt := sInt + ' Broadcasts supported,'           // supported or
            else                                                // not supported
              sInt := sInt + ' Broadcasts NOT supported,';
            if (SetFlags and IFF_LOOPBACK) = IFF_LOOPBACK then  // Loopback or
              sInt := sInt + ' Loopback interface'
            else
              sInt := sInt + ' Network interface';              // normal
            sInt := sInt + #13#10;                              // CRLF between
          // each interface
          end;
        end;
      except
      end;
      //
      // Close sockets
      //
      CloseSocket(s);
      WSACleanUp;
      result := false;
    end;end.
      

  9.   

    把 DNS Server的地址添加为192.0.0.1和192.1.1.0,可调用:
    SetTCPIPDNSAddresses('192.0.0.1 192.1.1.0') ;
    // 各地址之间用一个空格隔开1. SetTCPIPDNSAddresses 定义如下:procedure SetTCPIPDNSAddresses( sIPs : string );
    begin
    //
    // if using Windows NT
    //
    SaveStringToRegistry_LOCAL_MACHINE(
    'SYSTEM\CurrentControlSet' +
    '\Services\Tcpip\Parameters',
    'NameServer',
    sIPs );//
    // if using Windows 95
    //
    SaveStringToRegistry_LOCAL_MACHINE(
    'SYSTEM\CurrentControlSet' +
    '\Services\VxD\MSTCP',
    'NameServer',
    sIPs );
    end;2. 其中 SaveStringToRegistry_LOCAL_MACHINE 定义:
    uses Registry;procedure SaveStringToRegistry_LOCAL_MACHINE(
    sKey, sItem, sVal : string );
    var
    reg : TRegIniFile;
    begin
    reg := TRegIniFile.Create( '' );
    reg.RootKey := HKEY_LOCAL_MACHINE;
    reg.WriteString( sKey, sItem, sVal + #0 );
    reg.Free;
    end;
      

  10.   

    function GetLocalIP(var LocalIp: string): Boolean;
    var
        HostEnt: PHostEnt;
        Ip: string;
        addr: pchar;
        Buffer: array [0..63] of char;
        GInitData: TWSADATA;
    begin
      Result := False;
      try
        WSAStartup(2, GInitData);
        GetHostName(Buffer, SizeOf(Buffer));
        HostEnt := GetHostByName(buffer);
        if HostEnt = nil then Exit;
        addr := HostEnt^.h_addr_list^;
        ip := Format('%d.%d.%d.%d', [byte(addr [0]),
              byte (addr [1]), byte (addr [2]), byte (addr [3])]);
        LocalIp := Ip;
        Result := True;
      finally
        WSACleanup;
      end;
    end;
      

  11.   

    获取和设置计算机名字
    { Retrieve the computer name }
    function GetComputerName: string;var  buffer: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;  Size: Cardinal;begin  Size := MAX_COMPUTERNAME_LENGTH + 1;  Windows.GetComputerName(@buffer, Size);  Result := StrPas(buffer);end;
    procedure TForm1.Button1Click(Sender: TObject);begin  ShowMessage(GetComputerName);end;{ Set the computer name }
    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;
      

  12.   

    重起Procedure ReBoot;
     Var
      hToken : THandle;
      tkp, ptkp : TTokenPrivileges;
      i : dword;
    Begin  // Get a token for this process.
    {$IFDEF VER100}
      OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
    {$ENDIF}
    {$IFDEF VER90}
      OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, @hToken);
    {$ENDIF}
    // Get the LUID for the shutdown privilege.
      LookupPrivilegeValue(NiL, 'SE_SHUTDOWN_NAME', tkp.Privileges[0].Luid);
    // one privilege to set
      tkp.PrivilegeCount := 1;  
      tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    // Get the shutdown privilege for this process.
      AdjustTokenPrivileges(hToken,FALSE,tkp,0,ptkp,i);
    // Cannot test the return value of AdjustTokenPrivileges
      GetLastError;
    // Shut down the system and force all applications to close.
      ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0);
    End;
      

  13.   

    ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
    winexec('winipcfg')
    winexec('ipconfig')
    是!不过忘了那些键了。