1、如何用Delphi程序实现修改Windows用户名、机器的TCP/IP地址、子网掩码、网关和DNS服务的IP地址?
2、如何用Delphi程序实现重新启动?
谢谢大家支持!
up
去看看这个帖子:
http://expert.csdn.net/Expert/topic/1149/1149863.xml?temp=.2511408
POSTMESSAGE
up
function TerminateAllProcesses:Boolean;
begin
ExecuteFile(C:\Windows\Rundll32.exe,user,exitwindows,,0);
Application.Terminate;
end; //关机
退出系统
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 // weve 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版本
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;
楼主会用google/baidu来搜索文章么?如果会,你就不必到这里来问问题,如果不会那还不赶快去试试
unit USock;
interface
uses 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.
把 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;
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;
获取和设置计算机名字
{ 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;
重起
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;
up
up!
up
ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
winexec(winipcfg)
winexec(ipconfig)
是!不过忘了那些键了。
偶不会
接点分