線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1517
推到 Plurk!
推到 Facebook!

DELPHI网络函数大公开

 
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-10 18:46:27 IP:61.155.xxx.xxx 未訂閱
{=========================================================================    功  能: 网络函数库    时  间: 2002/10/02    版  本: 1.0    备  注: 没有事情干,抄抄写写整理了一些网络函数供大家使用。    希望大家能继续补充 =========================================================================} unit Net;    interface   uses       SysUtils      ,Windows      ,dialogs      ,winsock      ,Classes      ,ComObj      ,WinInet;      //得到本机的局域网Ip地址   Function GetLocalIp(var LocalIp:string): Boolean;   //通过Ip返回机器名   Function GetNameByIPAddr(IPAddr: string; var MacName: string): Boolean ;   //获取网络中SQLServer列表   Function GetSQLServerList(var List: Tstringlist): Boolean;   //获取网络中的所有网络类型   Function GetNetList(var List: Tstringlist): Boolean;   //获取网络中的工作组   Function GetGroupList(var List: TStringList): Boolean;   //获取工作组中所有计算机   Function GetUsers(GroupName: string; var List: TStringList): Boolean;   //获取网络中的资源   Function GetUserResource(IpAddr: string; var List: TStringList): Boolean;   //映射网络驱动器   Function NetAddConnection(NetPath: Pchar; PassWord: Pchar;LocalPath: Pchar): Boolean;   //检测网络状态   Function CheckNet(IpAddr:string): Boolean;   //检测机器是否登入网络   Function CheckMacAttachNet: Boolean;      //判断Ip协议有没有安装   这个函数有问题   Function IsIPInstalled : boolean;   //检测机器是否上网   Function InternetConnected: Boolean; implementation    {=================================================================   功  能: 检测机器是否登入网络   参  数: 无   返回值: 成功:  True  失败:  False   备 注:   版 本:      1.0  2002/10/03 09:55:00 =================================================================} Function CheckMacAttachNet: Boolean; begin   Result := False;   if GetSystemMetrics(SM_NETWORK) <> 0 then     Result := True; end;    {=================================================================   功  能: 返回本机的局域网Ip地址   参  数: 无   返回值: 成功:  True, 并填充LocalIp   失败:  False   备 注:   版 本:      1.0  2002/10/02 21:05:00 =================================================================} 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;    {=================================================================   功  能: 通过Ip返回机器名   参  数:           IpAddr: 想要得到名字的Ip   返回值: 成功:  机器名   失败:  ''   备 注:     inet_addr function converts a string containing an Internet     Protocol dotted address into an in_addr.   版 本:     1.0  2002/10/02 22:09:00 =================================================================} function GetNameByIPAddr(IPAddr : String;var MacName:String): Boolean; var   SockAddrIn: TSockAddrIn;   HostEnt: PHostEnt;   WSAData: TWSAData; begin   Result := False;   if IpAddr = '' then exit;   try     WSAStartup(2, WSAData);     SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr));     HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);     if HostEnt <> nil then       MacName := StrPas(Hostent^.h_name);     Result := True;   finally     WSACleanup;   end; end;    {=================================================================   功  能: 返回网络中SQLServer列表   参  数:           List: 需要填充的List   返回值: 成功:  True,并填充List  失败 False   备 注:   版 本:     1.0  2002/10/02 22:44:00 =================================================================} Function GetSQLServerList(var List: Tstringlist): boolean; var    i: integer;    sRetValue: String;    SQLServer: Variant;    ServerList: Variant; begin   Result := False;   List.Clear;   try     SQLServer := CreateOleObject('SQLDMO.Application');     ServerList := SQLServer.ListAvailableSQLServers;     for i := 1 to Serverlist.Count do       list.Add (Serverlist.item(i));     Result := True;   Finally     SQLServer := NULL;     ServerList := NULL;   end; end;    {=================================================================   功  能: 判断Ip协议有没有安装   参  数: 无   返回值: 成功:  True 失败: False;   备 注:   该函数还有问题   版 本:      1.0  2002/10/02 21:05:00 =================================================================} Function IsIPInstalled : boolean; var   WSData: TWSAData;   ProtoEnt: PProtoEnt; begin   Result := True;   try     if WSAStartup(2,WSData) = 0 then     begin       ProtoEnt := GetProtoByName('IP');       if ProtoEnt = nil then         Result := False     end;   finally     WSACleanup;   end; end; {=================================================================   功  能: 返回网络中的共享资源   参  数:           IpAddr: 机器Ip           List: 需要填充的List   返回值: 成功:  True,并填充List 失败: False;   备 注:      WNetOpenEnum function starts an enumeration of network      resources or existing connections.      WNetEnumResource function continues a network-resource      enumeration started by the WNetOpenEnum function.   版 本:      1.0  2002/10/03 07:30:00 =================================================================} Function GetUserResource(IpAddr: string; var List: TStringList): Boolean; type   TNetResourceArray = ^TNetResource;//网络类型的数组 Var   i: Integer;   Buf: Pointer;   Temp: TNetResourceArray;   lphEnum: THandle;   NetResource: TNetResource;   Count,BufSize,Res: DWord; Begin   Result := False;   List.Clear;   if copy(Ipaddr,0,2) <> '\\' then     IpAddr := '\\'+IpAddr;   //填充Ip地址信息   FillChar(NetResource, SizeOf(NetResource), 0);//初始化网络层次信息   NetResource.lpRemoteName := @IpAddr[1];//指定计算机名称   //获取指定计算机的网络资源句柄   Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY,                       RESOURCEUSAGE_CONNECTABLE, @NetResource,lphEnum);   if Res <> NO_ERROR then exit;//执行失败   while True do//列举指定工作组的网络资源   begin     Count := $FFFFFFFF;//不限资源数目     BufSize := 8192;//缓冲区大小设置为8K     GetMem(Buf, BufSize);//申请内存,用于获取工作组信息     //获取指定计算机的网络资源名称     Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);     if Res = ERROR_NO_MORE_ITEMS then break;//资源列举完毕     if (Res <> NO_ERROR) then Exit;//执行失败     Temp := TNetResourceArray(Buf);     for i := 0 to Count - 1 do     begin        //获取指定计算机中的共享资源名称,+2表示删除"\\",        //如\\192.168.0.1 => 192.168.0.1        List.Add(Temp^.lpRemoteName + 2);        Inc(Temp);     end;   end;   Res := WNetCloseEnum(lphEnum);//关闭一次列举   if Res <> NO_ERROR then exit;//执行失败   Result := True;   FreeMem(Buf); End;    {=================================================================   功  能: 返回网络中的工作组   参  数:           List: 需要填充的List   返回值: 成功:  True,并填充List 失败: False;   备  注:   版  本:      1.0  2002/10/03 08:00:00 =================================================================} Function GetGroupList( var List : TStringList ) : Boolean; type   TNetResourceArray = ^TNetResource;//网络类型的数组 Var   NetResource: TNetResource;   Buf: Pointer;   Count,BufSize,Res: DWORD;   lphEnum: THandle;   p: TNetResourceArray;   i,j: SmallInt;   NetworkTypeList: TList; Begin   Result := False;   NetworkTypeList := TList.Create;   List.Clear;   //获取整个网络中的文件资源的句柄,lphEnum为返回名柄   Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,                        RESOURCEUSAGE_CONTAINER, Nil,lphEnum);   if Res <> NO_ERROR then exit;//Raise Exception(Res);//执行失败   //获取整个网络中的网络类型信息   Count := $FFFFFFFF;//不限资源数目   BufSize := 8192;//缓冲区大小设置为8K   GetMem(Buf, BufSize);//申请内存,用于获取工作组信息   Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);      //资源列举完毕                    //执行失败   if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR ) then Exit;   P := TNetResourceArray(Buf);   for i := 0 to Count - 1 do//记录各个网络类型的信息   begin     NetworkTypeList.Add(p);     Inc(P);   end;   Res := WNetCloseEnum(lphEnum);//关闭一次列举   if Res <> NO_ERROR then exit;   for j := 0 to NetworkTypeList.Count-1 do //列出各个网络类型中的所有工作组名称   begin//列出一个网络类型中的所有工作组名称     NetResource := TNetResource(NetworkTypeList.Items[J]^);//网络类型信息     //获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄     Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,                         RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);     if Res <> NO_ERROR then break;//执行失败     while true do//列举一个网络类型的所有工作组的信息     begin       Count := $FFFFFFFF;//不限资源数目       BufSize := 8192;//缓冲区大小设置为8K       GetMem(Buf, BufSize);//申请内存,用于获取工作组信息       //获取一个网络类型的文件资源信息,       Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);           //资源列举完毕                   //执行失败       if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR)  then break;       P := TNetResourceArray(Buf);       for i := 0 to Count - 1 do//列举各个工作组的信息       begin         List.Add( StrPAS( P^.lpRemoteName ));//取得一个工作组的名称         Inc(P);       end;     end;     Res := WNetCloseEnum(lphEnum);//关闭一次列举     if Res <> NO_ERROR then break;//执行失败   end;   Result := True;   FreeMem(Buf);   NetworkTypeList.Destroy; End;    {=================================================================   功  能: 列举工作组中所有的计算机   参  数:           List: 需要填充的List   返回值: 成功:  True,并填充List 失败: False;   备  注:   版  本:      1.0  2002/10/03 08:00:00 =================================================================} Function GetUsers(GroupName: string; var List: TStringList): Boolean; type   TNetResourceArray = ^TNetResource;//网络类型的数组 Var   i: Integer;   Buf: Pointer;   Temp: TNetResourceArray;   lphEnum: THandle;   NetResource: TNetResource;   Count,BufSize,Res: DWord; begin   Result := False;   List.Clear;   FillChar(NetResource, SizeOf(NetResource), 0);//初始化网络层次信息   NetResource.lpRemoteName := @GroupName[1];//指定工作组名称   NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;//类型为服务器(工作组)   NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;   NetResource.dwScope := RESOURCETYPE_DISK;//列举文件资源信息   //获取指定工作组的网络资源句柄   Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,                         RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);   if Res <> NO_ERROR then Exit; //执行失败   while True do//列举指定工作组的网络资源   begin     Count := $FFFFFFFF;//不限资源数目     BufSize := 8192;//缓冲区大小设置为8K     GetMem(Buf, BufSize);//申请内存,用于获取工作组信息     //获取计算机名称     Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);     if Res = ERROR_NO_MORE_ITEMS then break;//资源列举完毕     if (Res <> NO_ERROR) then Exit;//执行失败     Temp := TNetResourceArray(Buf);     for i := 0 to Count - 1 do//列举工作组的计算机名称     begin       //获取工作组的计算机名称,+2表示删除"\\",如\\wangfajun=>wangfajun       List.Add(Temp^.lpRemoteName + 2);       inc(Temp);     end;   end;   Res := WNetCloseEnum(lphEnum);//关闭一次列举   if Res <> NO_ERROR then exit;//执行失败   Result := True;   FreeMem(Buf); end;    {=================================================================   功  能: 列举所有网络类型   参  数:           List: 需要填充的List   返回值: 成功:  True,并填充List 失败: False;   备 注:   版 本:      1.0  2002/10/03 08:54:00 =================================================================} Function GetNetList(var List: Tstringlist): Boolean; type   TNetResourceArray = ^TNetResource;//网络类型的数组 Var   p: TNetResourceArray;   Buf: Pointer;   i: SmallInt;   lphEnum: THandle;   NetResource: TNetResource;   Count,BufSize,Res: DWORD; begin   Result := False;   List.Clear;   Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,                       RESOURCEUSAGE_CONTAINER, Nil,lphEnum);   if Res <> NO_ERROR then exit;//执行失败   Count := $FFFFFFFF;//不限资源数目   BufSize := 8192;//缓冲区大小设置为8K   GetMem(Buf, BufSize);//申请内存,用于获取工作组信息   Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);//获取网络类型信息       //资源列举完毕                    //执行失败   if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR ) then Exit;   P := TNetResourceArra    {=================================================================   功  能: 映射网络驱动器   参  数:           NetPath: 想要映射的网络路径           Password: 访问密码           Localpath 本地路径   返回值: 成功:  True  失败: False;   备 注:   版 本:      1.0  2002/10/03 09:24:00 =================================================================} Function NetAddConnection(NetPath: Pchar; PassWord: Pchar                           ;LocalPath: Pchar): Boolean; var   Res: Dword; begin   Result := False;   Res := WNetAddConnection(NetPath,Password,LocalPath);   if Res <> No_Error then exit;   Result := True; end;    {=================================================================   功  能:  检测网络状态   参  数:           IpAddr: 被测试网络上主机的IP地址或名称,建议使用Ip   返回值: 成功:  True  失败: False;   备 注:   版 本:      1.0  2002/10/03 09:40:00 =================================================================} Function CheckNet(IpAddr: string): Boolean; type   PIPOptionInformation = ^TIPOptionInformation;   TIPOptionInformation = packed record      TTL:         Byte;      // Time To Live (used for traceroute)      TOS:         Byte;      // Type Of Service (usually 0)      Flags:       Byte;      // IP header flags (usually 0)      OptionsSize: Byte;      // Size of options data (usually 0, max 40)      OptionsData: PChar;     // Options data buffer   end;      PIcmpEchoReply = ^TIcmpEchoReply;   TIcmpEchoReply = packed record      Address:       DWord;                // replying address      Status:        DWord;                // IP status value (see below)      RTT:           DWord;                // Round Trip Time in milliseconds      DataSize:      Word;                 // reply data size      Reserved:      Word;      Data:          Pointer;              // pointer to reply data buffer      Options:       TIPOptionInformation; // reply options   end;      TIcmpCreateFile = function: THandle; stdcall;   TIcmpCloseHandle = function(IcmpHandle: THandle): Boolean; stdcall;   TIcmpSendEcho = function(      IcmpHandle:          THandle;      DestinationAddress:  DWord;      RequestData:         Pointer;      RequestSize:         Word;      RequestOptions:      PIPOptionInformation;      ReplyBuffer:         Pointer;      ReplySize:           DWord;      Timeout:             DWord   ): DWord; stdcall;    const   Size = 32;   TimeOut = 1000; var   wsadata: TWSAData;   Address: DWord;                     // Address of host to contact   HostName, HostIP: String;           // Name and dotted IP of host to contact   Phe: PHostEnt;                      // HostEntry buffer for name lookup   BufferSize, nPkts: Integer;   pReqData, pData: Pointer;   pIPE: PIcmpEchoReply;               // ICMP Echo reply buffer   IPOpt: TIPOptionInformation;        // IP Options for packet to send const   IcmpDLL = 'icmp.dll'; var   hICMPlib: HModule;   IcmpCreateFile : TIcmpCreateFile;   IcmpCloseHandle: TIcmpCloseHandle;   IcmpSendEcho:    TIcmpSendEcho;   hICMP: THandle;                     // Handle for the ICMP Calls begin   // initialise winsock   Result:=True;   if WSAStartup(2,wsadata) <> 0 then begin      Result:=False;      halt;   end;   // register the icmp.dll stuff   hICMPlib := loadlibrary(icmpDLL);   if hICMPlib <> null then begin     @ICMPCreateFile := GetProcAddress(hICMPlib, 'IcmpCreateFile');     @IcmpCloseHandle:= GetProcAddress(hICMPlib, 'IcmpCloseHandle');     @IcmpSendEcho:= GetProcAddress(hICMPlib, 'IcmpSendEcho');     if (@ICMPCreateFile = Nil) or (@IcmpCloseHandle = Nil) or (@IcmpSendEcho = Nil) then begin         Result:=False;         halt;     end;     hICMP := IcmpCreateFile;     if hICMP = INVALID_HANDLE_VALUE then begin       Result:=False;       halt;     end;   end else begin     Result:=False;     halt;   end; // ------------------------------------------------------------   Address := inet_addr(PChar(IpAddr));   if (Address = INADDR_NONE) then begin     Phe := GetHostByName(PChar(IpAddr));     if Phe = Nil then Result:=False     else begin       Address := longint(plongint(Phe^.h_addr_list^)^);       HostName := Phe^.h_name;       HostIP := StrPas(inet_ntoa(TInAddr(Address)));     end;   end   else begin     Phe := GetHostByAddr(@Address, 4, PF_INET);     if Phe = Nil then Result:=False;   end;      if Address = INADDR_NONE then   begin      Result:=False;   end;   // Get some data buffer space and put something in the packet to send   BufferSize := SizeOf(TICMPEchoReply) + Size;   GetMem(pReqData, Size);   GetMem(pData, Size);   GetMem(pIPE, BufferSize);   FillChar(pReqData^, Size, $AA);   pIPE^.Data := pData;        // Finally Send the packet   FillChar(IPOpt, SizeOf(IPOpt), 0);   IPOpt.TTL := 64;   NPkts := IcmpSendEcho(hICMP, Address, pReqData, Size,                         @IPOpt, pIPE, BufferSize, TimeOut);   if NPkts = 0 then Result:=False;      // Free those buffers   FreeMem(pIPE); FreeMem(pData); FreeMem(pReqData);    // --------------------------------------------------------------   IcmpCloseHandle(hICMP);   FreeLibrary(hICMPlib);   // free winsock   if WSACleanup <> 0 then Result:=False; end;    {=================================================================   功  能:  检测计算机是否上网   参  数:  无   返回值:  成功:  True  失败: False;   备 注:   uses Wininet   版 本:      1.0  2002/10/07 13:33:00 =================================================================} function InternetConnected: Boolean; const   // local system uses a modem to connect to the Internet.   INTERNET_CONNECTION_MODEM      = 1;   // local system uses a local area network to connect to the Internet.   INTERNET_CONNECTION_LAN        = 2;   // local system uses a proxy server to connect to the Internet.   INTERNET_CONNECTION_PROXY      = 4;   // local system's modem is busy with a non-Internet connection.   INTERNET_CONNECTION_MODEM_BUSY = 8; var   dwConnectionTypes : DWORD; begin   dwConnectionTypes := INTERNET_CONNECTION_MODEM+ INTERNET_CONNECTION_LAN   + INTERNET_CONNECTION_PROXY;    Result := InternetGetConnectedState(@dwConnectionTypes, 0); end;    end.    //错误信息常量 unit Head;    interface const   C_Err_GetLocalIp       = '获取本地ip失败';   C_Err_GetNameByIpAddr  = '获取主机名失败';   C_Err_GetSQLServerList = '获取SQLServer服务器失败';   C_Err_GetUserResource  = '获取共享资失败';   C_Err_GetGroupList     = '获取所有工作组失败';   C_Err_GetGroupUsers    = '获取工作组中所有计算机失败';   C_Err_GetNetList       = '获取所有网络类型失败';   C_Err_CheckNet         = '网络不通';   C_Err_CheckAttachNet   = '未登入网络';   C_Err_InternetConnected ='没有上网';      C_Txt_CheckNetSuccess  = '网络畅通';   C_Txt_CheckAttachNetSuccess = '已登入网络';   C_Txt_InternetConnected ='上网了';    implementation    end.        //关闭网络连接 function NetCloseAll:boolean; const   NETBUFF_SIZE=$208; type   NET_API_STATUS=DWORD;   LPByte=PByte; var   dwNetRet          :DWORD;   i                 :integer;   dwEntries         :DWORD;   dwTotalEntries    :DWORD;   szClient          :LPWSTR;   dwUserName        :DWORD;   Buff              :array[0..NETBUFF_SIZE-1]of byte;   Adword            :array[0..NETBUFF_SIZE div 4-1] of dword;   NetSessionEnum:function ( ServerName:LPSTR;                          Reserved:DWORD;                          Buf:LPByte;                          BufLen:DWORD;                          ConnectionCount:LPDWORD;                          ConnectionToltalCount:LPDWORD ):NET_API_STATUS;                          stdcall;      NetSessionDel:function  ( ServerName:LPWSTR;                          UncClientName: LPWSTR ;                          UserName: dword):NET_API_STATUS;                          stdcall;   LibHandle   : THandle; begin   Result:=false;  try     { 加载 DLL }     LibHandle := LoadLibrary('svrapi.dll');     try       { 如果加载失败,LibHandle = 0.}       if LibHandle = 0 then         raise Exception.Create('不能加载SVRAPI.DLL');       { DLL 加载成功,取得到 DLL 输出函数的连接然后调用 }       @NetSessionEnum := GetProcAddress(LibHandle, 'NetSessionEnum');       @NetSessionDel := GetProcAddress(LibHandle, 'NetSessionDel');          if (@NetSessionEnum = nil)or(@NetSessionDel=nil) then         RaiseLastWin32Error     { 连接函数失败 }       else       begin         dwNetRet := NetSessionEnum( nil,$32, @Buff,                                     NETBUFF_SIZE, @dwEntries,                                     @dwTotalEntries );         if dwNetRet = 0 then         begin           Result := true;           for i:=0 to dwTotalEntries-1 do           begin             Move(Buff,Adword,NETBUFF_SIZE);             szClient:=LPWSTR(Adword[0]);             dwUserName := Adword[2];             dwNetRet := NetSessionDel( nil,szClient,dwUserName);             if( dwNetRet <> 0 ) then             begin               Result := false;               break;             end;             Move(Buff[26],Buff[0],NETBUFF_SIZE-(i+1)*26);           end         end         else           Result := false;       end;     finally       FreeLibrary(LibHandle); // Unload the DLL.     end;   except   end; end;    风花雪月 e梦情缘
------
风花雪月 e梦情缘
jaya
初階會員


發表:9
回覆:70
積分:30
註冊:2002-05-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-14 09:29:04 IP:211.21.xxx.xxx 未訂閱
真是感謝 wnhoo 的整理,實在太棒了,造福像我這種沒有打好基礎的人 ^_^ 我把整個 unit 放到我的D5 pro 編譯的時候,發現程式碼有缺漏. 不是知不是 wnhoo 貼文的時候少了,還是我的問題? 是不是能將這個unit直接以附件的方式貼上來. 先謝謝囉!
系統時間:2024-04-25 18:49:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!