Windows:如何将普通进程注册为服务进程

本文详细介绍了如何将Windows上的普通进程注册为服务,包括通过代码实现、利用VS转换、sc命令、Instsrv.exe+Srvany.exe以及推荐的nssm工具。nssm因其简单易用和功能强大而被强烈推荐,它允许将应用封装成服务并自动启动,具备服务管理功能。
摘要由CSDN通过智能技术生成

最近遇到了一个需求:
需要把普通进程封装为服务进程,将积累的几种方案记录下来

进程和服务

首先来了解一下什么是服务和进程

进程是指在系统中正在运行的一个应用程序;线程是系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元。对于操 作系统而言,其调度单元是线程。一个进程至少包括一个线程,通常将该线程称为主线程。一个进程从主线程的执行开始进而创建一个或多个附加线程,就是所谓基于多线程的多任务。
服务相当于支持系统运行的一些必要程序,程序里运行的则是 当前使用的软件一般来讲程序里的任务可以关闭,后台则有一些不能关闭,如果关了系统进程就不能正常运行了。

将进程改为服务

我们的需求:
将普通进程注册为服务。
一共有5种方案,推荐第4种和第5种

一、通过代码来实现

这种方案比较麻烦,且不适用。
将控制台程序改造为windows服务程序

二、利用VS将窗口服务程序改为Windows服务于后台运行

不推荐,比较繁琐,不太符合需求!
利用VS将窗口

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Windows 中,进程是否有管理员权限,取决于它的安全令牌中是否包含管理员组的 SID。因此,可以通过获取进程的安全令牌,判断它是否包含管理员组的 SID 来判断进程是否是管理员进程。 下面是一个简单的示例代码,可以判断指定进程是否是管理员进程: ```c++ #include <Windows.h> #include <iostream> bool IsAdmin(HANDLE token) { BOOL is_admin = FALSE; PSID admin_group = NULL; // 获取管理员组的 SID SID_IDENTIFIER_AUTHORITY nt_authority = SECURITY_NT_AUTHORITY; if (!AllocateAndInitializeSid(&nt_authority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &admin_group)) { return false; } // 判断进程是否是管理员 if (!CheckTokenMembership(token, admin_group, &is_admin)) { is_admin = false; } FreeSid(admin_group); return is_admin == TRUE; } bool IsProcessAdmin(DWORD pid) { HANDLE process = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); if (!process) { return false; } HANDLE token; if (!OpenProcessToken(process, TOKEN_QUERY, &token)) { CloseHandle(process); return false; } bool is_admin = IsAdmin(token); CloseHandle(token); CloseHandle(process); return is_admin; } int main(int argc, char* argv[]) { if (argc != 2) { std::cout << "Usage: " << argv[0] << " <pid>" << std::endl; return 1; } DWORD pid = std::stoul(argv[1]); bool is_admin = IsProcessAdmin(pid); std::cout << "Process " << pid << " is admin process: " << (is_admin ? "Yes" : "No") << std::endl; return 0; } ``` 在上面的代码中,`IsAdmin` 函数用于判断进程是否是管理员进程,`IsProcessAdmin` 函数用于获取指定进程的安全令牌,并调用 `IsAdmin` 函数来判断进程是否是管理员进程。在 `main` 函数中,通过命令行参数传入要判断的进程的 PID,输出该进程是否是管理员进程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值