用DELPHI编写一个服务进程

现在的学生越来越聪明,一年前就发现他们不知从哪里学来退出教学系统的方法了,一节课下来,最终发现大半部分人都没听课,上自己的网,听自己的音乐。从一个学生口中得知他们的方法,原来是如此简单(具体方法不说了,免得有人有样学样)。

不过办法总是有的,计算机关闭前会先关闭用户进程,再关闭系统进程。呵呵,哪就写服务进程来监控教学系统的学生端吧,如果发现不存在就自动运行它。下面就是创建这个服务进程的过程,用DELPHI写的。

1、打开DELPHI--新建--Service Application

2、设置SERVICE属性:
     DisplayName:服务的名称,你可以起个很像WINDOWS自身的服务名称,让你找不得。
     AllowStop:允许停止吗?FALSE吧,不让停止
     ServiceType:用stWin32
     其他不设置了。

3、在SERVICE窗口中放个定时器,我设了5秒执行一次,代码就是查找教学系统学生端进程是否存在,如果不存在则启动他。
procedure TService1.Timer1Timer(Sender: TObject);
var
hSnapshot: THandle;//用于获得进程列表
lppe: TProcessEntry32;//用于查找进程
Found: Boolean;//用于判断进程遍历是否完成
f:boolean;
begin
hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//获得系统进程列表
lppe.dwSize := SizeOf(TProcessEntry32);//在调用Process32First API之前,需要初始化lppe记录的大小
Found := Process32First(hSnapshot, lppe);//将进程列表的第一个进程信息读入ppe记录中
f := false;
while Found do
begin
    if sametext(lppe.szExeFile,'Student3.exe') then
      f:=true;
    Found := Process32Next(hSnapshot, lppe);//将进程列表的下一个进程信息读入lppe记录中
end;
if not f then
    winexec('C:/Program Files/yzinfo/多媒体教学网络系统/Student3.exe',SW_normal);   //这是远志出的系统
end;

4、编译后最好改个文件名,如:svchost.exe(与系统的一样,都是学那些病毒、木马的),并放在学生机制系统目录下。

5、在学生机上注册服务,命令行:c:/系统目录/svchost.exe /install

6、完成,可起监控作用了,为了更安全,建议取消网络设置(有些学生禁止网络,虽然上不了网,但也不听课);同时也要设置不让他进入的服务设置,免得被他终止此服务进程。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cyai/archive/2010/09/02/5857576.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
program Project1; //{$APPTYPE CONSOLE} uses windows, SysUtils, tlhelp32, accctrl, aclapi; procedure SetPrivilege; var OldTokenPrivileges, TokenPrivileges: TTokenPrivileges; ReturnLength: dword; hToken: THandle; Luid: int64; begin OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken); LookupPrivilegeValue(nil, 'SeDebugPrivilege', Luid); TokenPrivileges.Privileges[0].luid := Luid; TokenPrivileges.PrivilegeCount := 1; TokenPrivileges.Privileges[0].Attributes := 0; AdjustTokenPrivileges(hToken, False, TokenPrivileges, SizeOf(TTokenPrivileges), OldTokenPrivileges, ReturnLength); OldTokenPrivileges.Privileges[0].luid := Luid; OldTokenPrivileges.PrivilegeCount := 1; OldTokenPrivileges.Privileges[0].Attributes := TokenPrivileges.Privileges[0].Attributes or SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, False, OldTokenPrivileges, ReturnLength, PTokenPrivileges(nil)^, ReturnLength); end; function GetProcessID(EXE_Name: PChar): THandle; var s: string; ok: Bool; ProcessListHandle: THandle; ProcessStruct: TProcessEntry32; begin Result := 0; //获得进程列表句柄 ProcessListHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0); try ProcessStruct.dwSize := SizeOf(ProcessStruct); //获得第一个进程句柄 ok := Process32First(ProcessListHandle, ProcessStruct); while ok do begin s := ExtractFileName(ProcessStruct.szExeFile);//获取进程的可执行文件名称 if AnsiCompareText(Trim(s), EXE_Name)=0 then//如果是HL程序名,表示找到游戏进程。 begin Result := ProcessStruct.th32ProcessID;//保留游戏进程句柄 break; end; ok := Process32Next(ProcessListHandle, ProcessStruct);//获取下一个进程信息。 end; finally CloseHandle(ProcessListHandle);//关闭进程列表句柄 end; end; ///////////////////////////////////////////////////////////////// Function CreateSystemProcess(szProcessName: LPTSTR): BOOL; Var hProcess: THANDLE; hToken, hNewToken: THANDLE; dwPid: DWORD; pOldDAcl: PACL; pNewDAcl: PACL; bDAcl: BOOL; bDefDAcl: BOOL; dwRet: DWORD; pSacl: PACL; pSidOwner: PSID; pSidPrimary: PSID; dwAclSize: DWORD; dwSaclSize: DWORD; dwSidOwnLen: DWORD; dwSidPrimLen: DWORD; dwSDLen: DWORD; ea: EXPLICIT_ACCESS; pOrigSd: PSECURITY_DESCRIPTOR; pNewSd: PSECURITY_DESCRIPTOR; si: STARTUPINFO; pi: PROCESS_INFORMATION; bError: BOOL; Label Cleanup; begin pOldDAcl:= nil; pNewDAcl:= nil; pSacl:= nil; pSidOwner:= nil; pSidPrimary:= nil; dwAclSize:= 0; dwSaclSize:= 0; dwSidOwnLen:= 0; dwSidPrimLen:= 0; pOrigSd:= nil; pNewSd:= nil; SetPrivilege; // 选择 WINLOGON 进程 dwPid := GetProcessId('WINLOGON.EXE'); If dwPid = High(Cardinal) Then begin bError := TRUE; Goto Cleanup; end; hProcess := OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwPid); If hProcess = 0 Then begin bError := TRUE; Goto Cleanup; end; If not OpenProcessToken(hProcess,READ_CONTROL or WRITE_DAC,hToken) Then begin bError := TRUE; Goto Cleanup; end; // 设置 ACE 具有所有访问权限 ZeroMemory(@ea, Sizeof(EXPLICIT_ACCESS)); BuildExplicitAccessWithName(@ea, 'Everyone', TOKEN_ALL_ACCESS, GRANT_ACCESS, 0); If not GetKernelObjectSecurity(hToken, DACL_SECURITY_INFORMATION, pOrigSd, 0, dwSDLen) Then begin {第一次调用给出的参数肯定返回这个错误,这样做的目的是 为了得到原安全描述符 pOrigSd 的长度} // HEAP_ZERO_MEMORY = 8;HEAP_GENERATE_EXCEPTIONS = &H4 If GetLastError = ERROR_INSUFFICIENT_BUFFER Then begin pOrigSd := HeapAlloc(GetProcessHeap(), $00000008, dwSDLen); If pOrigSd = nil Then begin bError := TRUE; Goto Cleanup; end; // 再次调用才正确得到安全描述符 pOrigSd If not GetKernelObjectSecurity(hToken, DACL_SECURITY_INFORMATION, pOrigSd, dwSDLen, dwSDLen) Then begin bError := TRUE; Goto Cleanup; end; end Else begin bError := TRUE; Goto Cleanup; end; end;//GetKernelObjectSecurity() // 得到原安全描述符的访问控制列表 ACL If not GetSecurityDescriptorDacl(pOrigSd,bDAcl,pOldDAcl,bDefDAcl) Then begin bError := TRUE; goto Cleanup; end; // 生成新 ACE 权限的访问控制列表 ACL dwRet := SetEntriesInAcl(1,@ea,pOldDAcl,pNewDAcl); If dwRet ERROR_SUCCESS Then begin pNewDAcl := nil; bError := TRUE; goto Cleanup; end; If not MakeAbsoluteSD(pOrigSd, pNewSd, dwSDLen, pOldDAcl^, dwAclSize, pSacl^, dwSaclSize, pSidOwner, dwSidOwnLen, pSidPrimary, dwSidPrimLen) Then begin {第一次调用给出的参数肯定返回这个错误,这样做的目的是 为了创建新的安全描述符 pNewSd 而得到各项的长度} If GetLastError = ERROR_INSUFFICIENT_BUFFER Then begin pOldDAcl := HeapAlloc(GetProcessHeap(), $00000008, dwAclSize); pSacl := HeapAlloc(GetProcessHeap(), $00000008, dwSaclSize); pSidOwner := HeapAlloc(GetProcessHeap(), $00000008, dwSidOwnLen); pSidPrimary := HeapAlloc(GetProcessHeap(), $00000008, dwSidPrimLen); pNewSd := HeapAlloc(GetProcessHeap(), $00000008, dwSDLen); If (pOldDAcl = nil) or (pSacl = nil) or (pSidOwner = nil) or (pSidPrimary = nil) or (pNewSd = nil) Then begin bError := TRUE; goto Cleanup; end; {再次调用才可以成功创建新的安全描述符 pNewSd 但新的安全描述符仍然是原访问控制列表 ACL} If not MakeAbsoluteSD(pOrigSd, pNewSd, dwSDLen, pOldDAcl^, dwAclSize, pSacl^, dwSaclSize, pSidOwner, dwSidOwnLen, pSidPrimary, dwSidPrimLen) Then begin bError := TRUE; goto Cleanup; end; end Else begin bError := TRUE; goto Cleanup; end; end; {将具有所有访问权限的访问控制列表 pNewDAcl 加入到新的 安全描述符 pNewSd 中} If not SetSecurityDescriptorDacl(pNewSd,bDAcl,pNewDAcl,bDefDAcl) Then begin bError := TRUE; goto Cleanup; end; // 将新的安全描述符加到 TOKEN 中 If not SetKernelObjectSecurity(hToken,DACL_SECURITY_INFORMATION,pNewSd) Then begin bError := TRUE; goto Cleanup; end; // 再次打开 WINLOGON 进程的 TOKEN,这时已经具有所有访问权限 If not OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,hToken) Then begin bError := TRUE; goto Cleanup; end; // 复制一份具有相同访问权限的 TOKEN If not DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, nil, SecurityImpersonation, TokenPrimary, hNewToken) Then begin bError := TRUE; goto Cleanup; end; ZeroMemory(@si,Sizeof(STARTUPINFO)); si.cb := Sizeof(STARTUPINFO); {不虚拟登陆用户的话,创建新进程会提示 1314 客户没有所需的特权错误} ImpersonateLoggedOnUser(hNewToken); {我们仅仅是需要建立高权限进程,不用切换用户 所以也无需设置相关桌面,有了新 TOKEN 足够} // 利用具有所有权限的 TOKEN,创建高权限进程 If not CreateProcessAsUser(hNewToken, nil, szProcessName, nil, nil, FALSE, 0, nil, nil, si, pi) Then begin bError := TRUE; goto Cleanup; end; bError := FALSE; Cleanup: If pOrigSd = nil Then HeapFree(GetProcessHeap(),0,pOrigSd); If pNewSd = nil Then HeapFree(GetProcessHeap(),0,pNewSd); If pSidPrimary = nil Then HeapFree(GetProcessHeap(),0,pSidPrimary); If pSidOwner = nil Then HeapFree(GetProcessHeap(),0,pSidOwner); If pSacl = nil Then HeapFree(GetProcessHeap(),0,pSacl); If pOldDAcl = nil Then HeapFree(GetProcessHeap(),0,pOldDAcl); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); CloseHandle(hToken); CloseHandle(hNewToken); //CloseHandle(hProcess); If bError Then Result := FALSE Else Result := True; end; begin CreateSystemProcess('test.exe'); { TODO -oUser -cConsole Main : Insert code here } end.
### 回答1: Delphi是一种高级编程语言,可以用来编写各种类型的应用程序,包括守护进程,也称为服务程序。 守护进程是一种在操作系统后台运行的程序,通常没有用户界面,用于提供一些持续运行的服务,如网络服务器、定时任务等。Delphi提供了一些集成的功能和组件,使我们能够轻松编写守护进程。 在Delphi编写守护进程,首先需要创建一个新的服务应用程序项目。在项目中,我们可以定义服务组件,该组件将负责实际的后台任务。服务组件是TDataset的子类,我们可以通过重写其事件来处理中断和定时任务。 服务组件还可以通过OnStart事件来处理应用程序启动时的初始化操作,OnStop事件用于处理应用程序关闭时的清理操作。Delphi还提供了其他事件,如OnPause、OnContinue,可用于处理暂停和继续操作。 除了定义服务组件外,我们还需要在项目文件中注册服务。在项目文件中的begin/end之间,我们可以按照要求添加服务的名称、服务组件的类名称以及服务启动类型等信息。然后可以通过控制台命令或拖动执行文件到操作系统的服务管理器中来安装服务。 通过使用Delphi编写守护进程,我们可以方便地控制后台服务的生命周期、处理各种事件和任务,并通过服务管理器进行简单的安装和卸载操作。Delphi的强大功能和易用性使我们能够高效地开发出稳定可靠的守护进程。 ### 回答2: Delphi是一种强大且流行的编程语言,它可以用于开发各种不同类型的应用程序,包括守护进程服务程序。 守护进程(又称服务程序)是在后台运行的一种特殊类型的程序,它不需要用户的交互操作,通常用于执行系统级任务或长期运行的任务。使用Delphi编写守护进程可以轻松实现这些任务。 Delphi提供了一些功能和库,以便我们编写守护进程。首先,它提供了一个TService类,该类是用于编写服务程序的基类。我们可以从这个类派生自己的服务类,并在其中实现所需的功能。TService类提供了一些基本方法,例如OnStart和OnStop,我们可以在这些方法中分别处理服务启动和停止时的操作。 另外,Delphi还提供了一些用于与操作系统进行交互的单元 (unit),例如Windows和WinSvc单元,它们提供了各种函数和过程,用于控制和管理守护进程。我们可以使用这些函数和过程来设置服务的属性,如名称、描述等,并监听操作系统对服务的命令,例如启动、停止等。 除了这些基本功能外,Delphi还支持多线程编程,这对于编写守护进程非常有用。我们可以使用线程来处理不同的任务,以避免阻塞主线程,同时提高系统的整体性能。 总而言之,使用Delphi编写守护进程服务程序)非常方便和灵活。Delphi提供了丰富的功能和库,使我们能够轻松实现各种系统级任务,并且它的多线程支持能够提高程序的并发性和效率。 ### 回答3: Delphi是一种编程语言,可以用于开发各种应用程序,包括守护进程服务程序)。守护进程是在后台运行的程序,它可以在操作系统启动时自动启动,并一直在运行,执行特定的任务或提供服务。 使用Delphi编写守护进程可以通过以下步骤实现: 1. 创建一个新的Delphi项目,并选择"服务"项目类型。 2. 在服务模块中,编写你的守护进程逻辑。 3. 在服务模块中实现"服务启动"、“服务停止"和其他服务控制事件的处理。 4. 在服务模块中使用线程来执行后台任务,并确保线程的安全性和资源释放。 5. 可以使用Delphi提供的各种组件和工具来实现守护进程所需的功能,例如日志记录、定时任务、与其他进程的通信等。 6. 编译和部署守护进程,通过注册服务的方式将其安装到操作系统中。 7. 在操作系统中配置守护进程的启动参数和其他设置,并启动它。 通过使用Delphi编写守护进程,你可以实现各种功能,例如网络服务、数据同步、定时任务、消息队列等。守护进程可以长时间运行,不需要用户的交互,可以在后台默默地完成任务。 需要注意的是,在编写守护进程时,需要考虑到安全性、稳定性和可靠性。守护进程需要处理错误和异常情况,确保程序的稳定运行,并且可以进行必要的日志记录和监控。同时,守护进程还需要考虑资源管理,避免内存泄漏和资源占用过多等问题。 总之,Delphi是一种非常适合用于编写守护进程的编程语言,通过合理的设计和编码,可以实现高效、稳定和可靠的服务程序。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hbqjzx

你的鼓励将是我分享的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值