我的IIS服务上上设有一个论坛,它允许用户上传资料.虽然限制了其上传文件的扩展名.但有人还可以将木马上传上去.我想能过Delphi制作一个后台监控程序.主要是监控一个目录中,只允许有指定的扩展名的文件.其他扩展名的文件将其删除,请问如何实现谢谢

解决方案 »

  1.   

    //通过ShellAPI函数来实现比较科学~~
    //注册一个事件响应~~
    //代码如下~~
    unit unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ShlObj, ShellAPI, Menus;const
      WM_SHNOTIFY = WM_USER + 10;type
      Tform1 = class(TForm)
        MemoNotifyLog: TMemo;
        MainMenu1: TMainMenu;
        N1: TMenuItem;
        N3: TMenuItem;
        N4: TMenuItem;
        N5: TMenuItem;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure N5Click(Sender: TObject);
        procedure N3Click(Sender: TObject);
      private
        { Private declarations }
        FNotifyHandle: THandle;
        procedure WMSHNOTIFY(var Msg: TMessage); message WM_SHNOTIFY;
      public
        { Public declarations }
      end;var
      form1: Tform1;implementation
       uses FileCtrl;
    {$R *.dfm}type
      NOTIFYREGISTER = packed record
        pidlPath: PItemIDList;
        bWatchSubtree: BOOL;
      end;
      PNotifyRegister = ^NOTIFYREGISTER;{$WARNINGS OFF}
    function SHChangeNotifyRegister(hWnd: HWND; dwFlags: Integer;
      wEventMask: Cardinal; uMsg: UINT; cItems: Integer;
      lpItems: PNotifyRegister): HWND; stdcall; external Shell32 index 2;function SHChangeNotifyDeregister(hWnd: HWND): Boolean; stdcall;
      external Shell32 index 4;function SHILCreateFromPath(pszPath: PChar; ppidl: PItemIDList;
      rgflnOut: PDWORD): HResult; stdcall; external Shell32 index 28;
    {$WARNINGS ON}
    procedure Tform1.FormCreate(Sender: TObject);
    var
      vNotifyRegister: NOTIFYREGISTER;
      vAttributes: WORD;
      vItemIDList: PItemIDList;
      Dir: string;
    const
      SELDIRHELP = 1000;
    begin
      Dir := '我的电脑';
      //if SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt],SELDIRHELP) then ;
      caption:='目录监视:'+Dir;
      SHILCreatefromPath(pchar(Dir), @vItemIDList, @vAttributes);
      vNotifyRegister.pidlPath := vItemIDList;
      vNotifyRegister.bWatchSubtree := True;  FNotifyHandle := SHChangeNotifyRegister(Handle,
        SHCNF_TYPE or SHCNF_IDLIST,
        SHCNE_ALLEVENTS or SHCNE_INTERRUPT, WM_SHNOTIFY, 1, @vNotifyRegister);  MemoNotifyLog.Clear;
    end;procedure Tform1.FormDestroy(Sender: TObject);
    begin
      SHChangeNotifyDeregister(FNotifyHandle);
    end;procedure Tform1.WMSHNOTIFY(var Msg: TMessage);
    type
      PSHNOTIFYSTRUCT = ^SHNOTIFYSTRUCT;
      SHNOTIFYSTRUCT = packed record
        dwItem1: PItemIDList;
        dwItem2: PItemIDList;
      end;
    var
      vBuffer: array[0..MAX_PATH] of Char;
      pidlItem: PSHNOTIFYSTRUCT;
      S: string;
    begin
      pidlItem := PSHNOTIFYSTRUCT(Msg.wParam);
      SHGetPathFromIDList(pidlItem.dwItem1, vBuffer);
      S := vBuffer;
      SHGetPathFromIDList(pidlItem.dwItem2, vBuffer);
      case Msg.lParam of //根据参数设置提示消息
        SHCNE_RENAMEITEM: S := '重命名文件' + S + '为' + vBuffer;
        SHCNE_CREATE: S := '建立文件 文件名:' + S;
        SHCNE_DELETE: S := '删除文件 文件名:' + S;
        SHCNE_MKDIR: S := '新建目录 目录名:' + S;
        SHCNE_RMDIR: S := '删除目录 目录名:' + S;
        SHCNE_MEDIAINSERTED: S := S + '中插入可移动存储介质';
        SHCNE_MEDIAREMOVED: S := S + '中移去可移动存储介质' + S + ' ' + vBuffer;
        SHCNE_DRIVEREMOVED: S := '移去驱动器' + S;
        SHCNE_DRIVEADD: S := '添加驱动器' + S;
        SHCNE_NETSHARE: S := '改变目录' + S + '的共享属性';
        SHCNE_ATTRIBUTES: S := '改变文件目录属性 文件名' + S;
        SHCNE_UPDATEDIR: S := '更新目录' + S;
        SHCNE_UPDATEITEM: S := '更新文件 文件名:' + S;
        SHCNE_SERVERDISCONNECT: S := '断开与服务器的连接' + S + ' ' + vBuffer;
        SHCNE_UPDATEIMAGE: S := 'SHCNE_UPDATEIMAGE';
        SHCNE_DRIVEADDGUI: S := 'SHCNE_DRIVEADDGUI';
        SHCNE_RENAMEFOLDER: S := '重命名文件夹' + S + '为' + vBuffer;
        SHCNE_FREESPACE: S := '磁盘空间大小改变';
        SHCNE_ASSOCCHANGED: S := '改变文件关联';
      else S := '未知操作' + IntToStr(Msg.lParam);
      end;
      MemoNotifyLog.Lines.Add(DateTimeTostr(Now)+'       '+S);
    end;procedure Tform1.N5Click(Sender: TObject);
    var s:string;
    begin
     
    end;procedure Tform1.N3Click(Sender: TObject);
    begin
     close;
    end;end.
      

  2.   

    MemoNotifyLog.Lines.Add(DateTimeTostr(Now)+'       '+S);
    这里检查到如果是  建立文件 --并检查文件名,不符合的去删掉
      

  3.   

    jinjazz(人雅的标记--落寞刺客)
    讨论。IIS是以服务方式启动了,其上传文件也就...,你这样能成吗?