windows下编程中的多用户、权限问题

编程中经常遇到windows相关的多用户问题,以下通过代码进行实际验证。

一、创建一个UserTest程序

复制代码
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Security.Principal;
using System.Text;
using System.Threading.Tasks;

namespace UserTest
{
    internal class Program
    {
        static void Main(string[] args)
        {

            // 获取当前进程
            Process currentProcess = Process.GetCurrentProcess();

            // 获取当前 Windows 用户
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            string userName = identity.Name;

            Console.WriteLine($"当前进程: {currentProcess.ProcessName}");
            Console.WriteLine($"启动用户: {userName}");

            WindowsPrincipal principal = new WindowsPrincipal(identity);

            // 检查用户是否为管理员
            bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);

            Console.WriteLine($"当前用户具有管理员权限: {isAdmin}");
            // 获取当前用户的主目录
            string userDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

            Console.WriteLine($"当前用户目录: {userDirectory}");

            Console.ReadLine();
        }
    }
}
复制代码

以此,我们可以获得当前进程的启动用户、权限、当前用户目录

运行得到结果

 二、使用管理员权限对当前用户的影响

验证:在非管理员权限账户下,使用管理员权限运行此程序

 结论:管理员权限并不会改变当前程序的用户目录和启动用户,只是改变了执行权限

三、常用的清单文件获取管理员权限对当前用户的影响

添加以下清单文件的程序在非管理员前线下执行

复制代码
<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>
复制代码

结论:只是增加了管理员权限,不会改变程序的运行用户和程序的用户目录

四、指定启动程序的用户

要在双击程序时使用其他用户启动,通常需要使用脚本或快捷方式来实现,因为 Windows 不直接支持这种功能。以下是一些可能的方法:

 使用批处理脚本

1. 创建批处理文件:
- 创建一个 `.bat` 文件,使用 `runas` 命令来指定用户。

@echo off
runas /user:DOMAIN\Username "path\to\your\program.exe"

- 当运行此批处理文件时,系统会提示输入密码。

使用快捷方式

1. 创建快捷方式:
- 右键点击桌面,选择“新建” > “快捷方式”。
- 在“请键入对象的位置”中输入:

 

runas /user:DOMAIN\Username "path\to\your\program.exe"

- 完成创建后,双击此快捷方式会提示输入密码。

使用任务计划程序

1. 创建计划任务:
- 打开任务计划程序,创建一个新任务。
- 在“常规”选项卡中,选择“使用以下用户账户运行”并输入目标用户。
- 在“操作”选项卡中,设置启动程序的路径。
- 创建一个指向该任务的快捷方式,使用 `schtasks` 命令来运行:

schtasks /run /tn "TaskName"

 

验证结果表:

双击 bat文件指定runas用户启动 进程处于当前会话上 获取的为指定的用户 当前用户目录为指定的用户目录 进程用户为指定用户
双击 快捷方式指定runas用户启动 进程处于当前会话上 获取的为指定的用户 当前用户目录为指定的用户目录 进程用户为指定用户
双击 发送快捷方式不指定runas用户启动 进程处于当前会话上 获取的为指定的用户 当前用户目录为指定的用户目录 进程用户为指定用户
使用定时任务启动 进程处于指定的会话上 获取的为指定的用户 当前用户目录为指定的用户目录 进程用户为指定用户
         

 

结论:

在不指定用户时,用户双击,哪个用户的会话就使用哪个用户的资源。

在指定用户时候,用户双击启动(通过会话),会在当前会话创建指定用户进程的程序。

在指定用户时候,不通过UI操作启动,完全使用指定用户的资源。

五、结论

  1. 桌面会话:

    • Windows 将图形界面程序与当前用户的桌面会话关联,因此即使程序以其他用户身份运行,它的界面仍会显示在当前用户的桌面上。
  2. 安全和隔离:

    • Windows 的安全模型设计为隔离不同用户的会话,以防止未经授权的访问。这意味着即使进程以其他用户身份运行,它也不能直接访问其他用户的桌面会话。
  3. 任务管理器显示:

    • 任务管理器会根据当前用户的会话显示程序,即使程序是由其他用户启动

 

六、指定会话启动

如果希望程序在不同用户的桌面会话中运行(例如在远程桌面或不同的用户会话中),可以考虑以下方法:

  1. 远程桌面:

    • 使用远程桌面协议 (RDP) 登录到目标用户的会话,然后启动程序。
  2. 切换用户:

    • 使用“切换用户”功能登录到另一个用户会话,然后启动程序。
  3. 任务计划程序:

    • 配置任务计划程序在目标用户的会话中运行任务,并确保“仅在用户登录时运行”选项被选中。
  4. 服务化  

 

posted @   卖雨伞的小男孩  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示