📄 netconnection.pas
字号:
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TIConnection.open : Integer;
var
FNetResource:TNetResourceA;
str:string;
res:Dword;
begin
if pos('\\',FAddress)=1 then str:=FAddress+'\'+fsharename
else str:='\\'+FAddress+'\'+fsharename;
FNetResource.dwType:=RESOURCETYPE_ANY;
FNetResource.lpLocalName:='';
FNetResource.lpProvider:=''; FNetResource.lpRemoteName:=pchar(str); res:=my_WNetAddConnection2(@FNetResource,pchar(fpassword),pchar(fusername),0);
list.clear;
list.add(FAddress);
if autodo then//若自动则不响应事件
begin
if (res=0) then
ShareEnum
else
if Assigned(FOnEchoClose) then
FOnEchoClose(Self, res);
end else
if Assigned(FOnEchoOpen) then
FOnEchoOpen(Self, res);
end;
function TIConnection.ShareEnum : Integer;
var
cbBuffer,EntriesRead, TotalAvail: longint;
hEnum:HWND;
res:NET_API_STATUS;
p:PSHARE_INFO1_NT;
IP_str:string;
ServerName:pwchar;
i:integer;
begin
if list.count>1 then
begin
list.clear;
list.add(FAddress);
end;
if (pos('\\',FAddress)=1) then
IP_str:=FAddress
else
IP_str:='\\'+FAddress;
ServerName:=StringToOleStr(IP_str);
cbBuffer:= $0ffffff; hEnum:=0;
res:=NetShareEnum_NT(ServerName,1,p,cbBuffer,EntriesRead,TotalAvail,hEnum);
if (res=0) or (res=234) then
if EntriesRead>0 then
for i:=0 to EntriesRead-1 do
begin
list.add(string(p^.netname)+' '+string(p^.remark));
inc(p);
end;
if autodo then
begin
if ((res=0) or (res=234)) then//若自动则不响应事件
begin
if Assigned(FOnEchoShareEnum) then
FOnEchoShareEnum(Self, res);
close;
end else
if Assigned(FOnEchoClose) then
FOnEchoClose(Self, res);
end else
if Assigned(FOnEchoShareEnum) then
FOnEchoShareEnum(Self, res);
end;
function TIConnection.close : Integer;
var
str:string;
begin
if pos('\\',FAddress)=1 then str:=FAddress+'\'+fsharename
else str:='\\'+FAddress+'\'+fsharename;
if Assigned(FOnOpenSucceed) then //响应外部的查找用户事件
FOnOpenSucceed(Self);
Result:=my_WNetCancelConnection2(pchar(str),0,true);
if FGetInfo then getserverinfo;//获取机器版本的信息
if Assigned(FOnEchoClose) then
FOnEchoClose(Self, Result);
end;
function usri1_flags(flags:DWORD):string;//返回说明
begin
result:='';
// if (flags and 1)=1 then result:='需要密码';
if (flags and 2)=2 then result:=result+'已停用,';
if (flags and $20)=$20 then result:=result+'空密码';
{ if (flags and 8)=8 then result:=result+'The home directory is required. Windows NT ignores this value';
// if (flags and $40)= $40 then result:=result+'该用户不能更改密码';
// if (flags and $20)= $20 then result:=result+'The Account is Locked';// if (flags and $80)= $80 then result:=result+'Password does not 期满'; } if result='' then result:='信息标记:'+inttostr(flags);end;
//经验:若要返回的数可以用,要注意是否为var类 如下的 dwRec变量,要在定义中设为var
//否则API函数返回后不可以用
//谝函数一定要在CLose连接后才有用
function TIConnection.NetQueryDisplayInformation(Level:integer;var var_list:Tstringlist):integer;
var
p:PNET_DISPLAY_USER;
res, i:DWORD;
dwRec:longint;
IP_str:string;
ServerName:pwchar;
count:integer;
begin
var_list.clear;
var_list.add(FAddress);
if (pos('\\',FAddress)=1) then
IP_str:=FAddress
else
IP_str:='\\'+FAddress;
ServerName:=StringToOleStr(IP_str);
i:=0;
res :=my_NetQueryDisplayInformation(ServerName, Level, i, 8000,8000,dwRec,@p);
if((res=0) or (res=234)) then
begin
if dwRec>0 then
begin
for count:=0 to dwRec-1 do
begin
var_list.add(inttostr(count+1)+'->['+string(p^.name)+'] '+usri1_flags(p^.flags)+' 描述:'+string(p^.comment)+' ID:'+inttostr(p^.user_id));
inc(p);
end;
end;
end;
end;
function TIConnection.get_user(Level:integer;var var_list:Tstringlist):integer;
var
FNetResource:TNetResourceA;
p:PNET_DISPLAY_USER;
res, i:DWORD;
dwRec:longint;
IP_str:string;
ServerName:pwchar;
count:integer;
begin
var_list.clear;
if (pos('\\',FAddress)=1) then
IP_str:=FAddress
else
IP_str:='\\'+FAddress;
ServerName:=StringToOleStr(IP_str);
//连接主机
ip_str:=ip_str+'\ipc$';
FNetResource.dwType:=RESOURCETYPE_ANY;
FNetResource.lpLocalName:='';
FNetResource.lpProvider:=''; FNetResource.lpRemoteName:=pchar(IP_str); res:=my_WNetAddConnection2(@FNetResource,'','',0);
if (res<>0) and (res<>1219) then exit; //0代表成功,1219代表凭据冲突,即先前已有连接还未断开
//找用户
i:=0;
res :=my_NetQueryDisplayInformation(ServerName, Level, i, 8000,8000,dwRec,@p);
if((res=0) or (res=234)) then
begin
if dwRec>0 then
begin
for count:=0 to dwRec-1 do
begin
if (p^.flags and 2)<>2 then//只有不停用的用户才要
var_list.add(string(p^.name));
inc(p);
end;
end;
end;
Result:=my_WNetCancelConnection2(pchar(ip_str),0,true);//关闭连接
end;
function TIConnection.my_EnumServices(var var_list:Tstringlist):integer;
var
BytesNeeded,serviceReturned,resumeHandle:Dword;
returnflag:Bool;
lpservice:Array of TEnumServiceStatus;
service:TEnumServiceStatus;
i,bytes:Dword;
hscmanager:SC_HANDLE;
str:string;
begin
if pos('\\',FAddress)=1 then str:=FAddress
else str:='\\'+FAddress;
var_list.Clear;
var_list.add(FAddress);
returnflag:=false;
resumeHandle:=0;
BytesNeeded:=0;
hscmanager:=OpenSCManager(pchar(str),0,SC_MANAGER_ALL_ACCESS);//打开service control manager database
if hscmanager =0 then
Begin
// var_list.add('无法打开service control manager database');
exit;
End;
returnflag:=EnumServicesStatus(hscmanager,
SERVICE_WIN32 or SERVICE_DRIVER,
SERVICE_ACTIVE or SERVICE_INACTIVE,
service,
0,
BytesNeeded,
serviceReturned,
resumeHandle);
//枚举Service
if (returnflag=false) and (GetLastError()=ERROR_MORE_DATA) then
begin
resumeHandle:=0;
bytes:=BytesNeeded + sizeof(TEnumServiceStatus);
SetLength(lpservice,bytes div sizeof(TEnumServiceStatus)+1); // 一定要设好大小,否则出错
returnflag:=EnumServicesStatus(hscmanager,
SERVICE_WIN32 or SERVICE_DRIVER,
SERVICE_ACTIVE or SERVICE_INACTIVE,
lpservice[0],
bytes,
BytesNeeded,
serviceReturned,
resumeHandle);
for i := 0 to serviceReturned-1 do
begin
if lpservice[i].ServiceStatus.dwCurrentState = SERVICE_STOPPED then
var_list.Add(inttostr(i+1)+'->['+lpservice[i].lpServiceName+'] '+lpservice[i].lpDisplayName+' :停止') else
if lpservice[i].ServiceStatus.dwCurrentState = SERVICE_RUNNING then
var_list.Add(inttostr(i+1)+'->['+lpservice[i].lpServiceName+'] '+lpservice[i].lpDisplayName+' :运行') else
var_list.Add(inttostr(i+1)+'->['+lpservice[i].lpServiceName+'] '+lpservice[i].lpDisplayName+' :暂停');
end;
end;
CloseServiceHandle(hscmanager);//关闭service control manager database
end;
end.
{procedure TForm1.Button2Click(Sender:TObject);
var
i:integer;
hService:SC_HANDLE;
lpServiceArgVectors:Pchar;
returnstatus:TServiceStatus;
begin
lpServiceArgVectors:=nil;
for i := 0 to (ListBox1.Items.Count-1) do
if ListBox1.Selected[i] then
begin
hService:=OpenService(hscmanager,
Pchar(ListBox1.Items[i]),
SERVICE_ALL_ACCESS);
//打开该Service
if hService < 0 then
begin
showmessage('无法打开该Service');
exit;
end;
QueryServiceStatus(hService,returnstatus);
//查看该Service的状态
if returnstatus.dwCurrentState = SERVICE_STOPPED then
//如果该Service已停止则启动它
StartService(hService,0,lpServiceArgVectors);
CloseServiceHandle(hService);//关闭该Service
end;
end;
procedure TForm1.Button3Click(Sender:TObject);
var
i:integer;
begin
for i := 0 to (ListBox1.Items.Count-1) do
if ListBox1.Selected[i] then
begin
hService:=OpenService(hscmanager,
Pchar (ListBox1.Items[i]),
SERVICE_ALL_ACCESS);
//打开该Service
if hService < 0 then
begin
showmessage('无法打开该Service');
exit;
end;
QueryServiceStatus(hService,returnstatus);
//查看该Service的状态
if returnstatus.dwCurrentState = SERVICE_RUNNING then
//如果该Service正在运行则停止它
ControlService(hService,
SERVICE_CONTROL_STOP,
returnstatus);
CloseServiceHandle(hService);//关闭该Service
end;
end;
procedure TForm1.FormClose(Sender:TObject;varAction:TCloseAction);
begin
CloseServiceHandle(hscmanager);//关闭service control manager database
End;
end.
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -