vista和win7在windows服务中交互桌面权限问题解决方法:穿透Session 0 隔离

yizhihongxing

在Windows操作系统中,服务是一种常见的后台程序,它可以在系统启动时自动运行,并在后台执行某些任务。在本攻略中,我们将详细介绍如何在Windows服务中解决桌面权限问题,并提供两个示例来说明其用法。

以下是两个示例,介绍如何在Windows服务中解决桌面权限问题:

示例一:使用Win32 API穿透Session0隔离

  1. 首先,我们需要使用Win32 API来穿透Session0隔离:
#include <windows.h>
#include <userenv.h>

BOOL EnablePrivilege(LPCTSTR lpszPrivilege, BOOL bEnable) {
    HANDLE hToken;
    TOKEN_PRIVILEGES tp;
    LUID luid;

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
        return FALSE;
    }

    if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid)) {
        CloseHandle(hToken);
        return FALSE;
    }

    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;

    if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) {
        CloseHandle(hToken);
        return FALSE;
    }

    CloseHandle(hToken);
    return TRUE;
}

BOOL StartProcessInSession0(LPCTSTR lpszCommandLine) {
    DWORD dwSessionId = 0;
    HANDLE hToken = NULL;
    HANDLE hDupToken = NULL;
    PROCESS_INFORMATION pi = { 0 };
    STARTUPINFO si = { 0 };
    si.cb = sizeof(si);

    if (!WTSQueryUserToken(dwSessionId, &hToken)) {
        return FALSE;
    }

    if (!DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hDupToken)) {
        CloseHandle(hToken);
        return FALSE;
    }

    if (!SetTokenInformation(hDupToken, TokenSessionId, &dwSessionId, sizeof(DWORD))) {
        CloseHandle(hDupToken);
        CloseHandle(hToken);
        return FALSE;
    }

    if (!EnablePrivilege(SE_TCB_NAME, TRUE)) {
        CloseHandle(hDupToken);
        CloseHandle(hToken);
        return FALSE;
    }

    if (!CreateProcessAsUser(hDupToken, NULL, (LPTSTR)lpszCommandLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) {
        CloseHandle(hDupToken);
        CloseHandle(hToken);
        return FALSE;
    }

    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    CloseHandle(hDupToken);
    CloseHandle(hToken);
    return TRUE;
}

在上面的示例中,我们首先定义了两个函数:EnablePrivilege和StartProcessInSession0。这些函数使用Win32 API来启动一个新进程,并穿透Session0隔离。

  1. 然后,我们可以在Windows服务中使用StartProcessInSession0函数来启动一个新进程:
void MyService::OnStart(DWORD dwArgc, LPTSTR* lpszArgv) {
    StartProcessInSession0(TEXT("C:\\Windows\\System32\\notepad.exe"));
}

在上面的示例中,我们首先定义了一个MyService类,并继承了CServiceBase类。然后,我们在OnStart方法中使用StartProcessInSession0函数来启动一个新进程。

示例二:使用PsExec穿透Session0隔离

  1. 首先,我们需要下载PsExec工具,并将其添加到系统路径中。

  2. 然后,我们可以在Windows服务中使用PsExec来启动一个新进程:

void MyService::OnStart(DWORD dwArgc, LPTSTR* lpszArgv) {
    system("psexec -i 0 -d C:\\Windows\\System32\\notepad.exe");
}

在上面的示例中,我们首先定义了一个MyService类,并继承了CServiceBase类。然后,我们在OnStart方法中使用system函数来调用PsExec工具,并使用-i和-d参数来穿透Session0隔离。

总之,在Windows服务中解决桌面权限问题是一种常见的需求,它可以帮助开发者在服务中启动一个新进程,并与桌面交互。开发者可以根据实际情况选择最适合自己的方法,并据需要其他自定义功能。使用Win32 API和PsExec可以大大简化Windows服务中解决桌面权限问题的过程,提高开发效率和可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vista和win7在windows服务中交互桌面权限问题解决方法:穿透Session 0 隔离 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • php里array_work用法实例分析

    PHP里array_walk的用法实例分析 在PHP中,array_walk是一个非常重要并且常用的数组操作函数,用于对数组中的每个元素应用用户自定义的函数callback。 array_walk基础用法 array_walk函数有两个必填参数,分别是待处理的数组和要应用到每个元素的callback函数。callback函数接受两个参数,分别是当前元素的值和…

    C# 2023年6月7日
    00
  • ASP.NET2.0中用Gridview控件操作数据的代码

    要在ASP.NET2.0中使用GridView控件操作数据,需要遵循以下步骤: 1.在页面中引入GridView控件 使用以下代码在页面中引入GridView控件: <asp:GridView ID="GridView1" runat="server"></asp:GridView> 2.在代码…

    C# 2023年5月31日
    00
  • 解析C#设计模式之单例模式

    我来给您讲解一下“解析C#设计模式之单例模式”的完整攻略。 一、什么是单例模式? 单例模式是一种常用的设计模式,它保证了一个类只能有一个实例,并提供一个全局访问点。 二、为什么要使用单例模式? 在很多场景中,我们需要保证某个类只拥有一个实例。比如唯一的数据库连接池、全局的日志对象等等。如果没有单例模式,我们每次都需要手动控制实例数量,这会带来很多问题。 三、…

    C# 2023年5月31日
    00
  • C# 操作PostgreSQL 数据库的示例代码

    首先我们需要使用C#的 Npgsql 库来连接并操作 PostgreSQL数据库。 连接PostgreSQL数据库 要连接 PostgreSQL 数据库,需要使用 Npgsql 库并指定主机名、端口、用户名和密码。下面是一个示例代码: using Npgsql; NpgsqlConnection conn = new NpgsqlConnection(&qu…

    C# 2023年6月1日
    00
  • C#列出当前系统所有正在运行程序的方法

    关于“C#列出当前系统所有正在运行程序的方法”的完整攻略,可以通过以下步骤来实现: 首先,需要引用System.Diagnostics命名空间,该命名空间提供了一些类,可以操作正在运行的进程,包括获取正在运行的进程信息。 接着,可以通过调用Process.GetProcesses()静态方法,来获取当前系统中正在运行的所有进程。该方法返回一个Process类…

    C# 2023年6月7日
    00
  • C# 扩展方法详解

    C# 扩展方法详解 什么是扩展方法 C# 中的扩展方法是一种特殊的静态方法,它可以为已存在的类或结构体类型添加新的方法,而无需继承或修改原始类型。 通过扩展方法,可以使已经存在的类型具有新的行为和功能,这个过程不需要访问原始类的源代码,也不需要使用继承或接口实现。 扩展方法的语法 扩展方法使得我们可以给已经存在的类型添加额外的方法, 而不需要修改源代码, 具…

    C# 2023年6月1日
    00
  • C#创建windows系统用户的方法

    下面是关于C#创建Windows系统用户的方法的完整攻略。 1.准备工作 在使用C#创建Windows系统用户之前,需要引入System.DirectoryServices.AccountManagement和System.Security.Principal两个命名空间。 using System.DirectoryServices.AccountMana…

    C# 2023年6月7日
    00
  • 基于C#编写经理评分系统

    基于C#编写经理评分系统攻略 系统简介 经理评分系统是一种基于评测流程的评分系统,可以用来对员工的工作表现进行评分,作为考核绩效的依据。本系统基于C#编写,采用MVC架构,前端使用Bootstrap框架。 系统流程 登录/注册 用户输入用户名和密码,进行登录或者注册。 创建评分表单 登录后进入创建评分表单页面,用户可以定义评分项、评分标准等。 分配工作任务 …

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部