编程中经常遇到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操作启动,完全使用指定用户的资源。
五、结论
-
桌面会话:
- Windows 将图形界面程序与当前用户的桌面会话关联,因此即使程序以其他用户身份运行,它的界面仍会显示在当前用户的桌面上。
-
安全和隔离:
- Windows 的安全模型设计为隔离不同用户的会话,以防止未经授权的访问。这意味着即使进程以其他用户身份运行,它也不能直接访问其他用户的桌面会话。
-
任务管理器显示:
- 任务管理器会根据当前用户的会话显示程序,即使程序是由其他用户启动
六、指定会话启动
如果希望程序在不同用户的桌面会话中运行(例如在远程桌面或不同的用户会话中),可以考虑以下方法:
-
远程桌面:
- 使用远程桌面协议 (RDP) 登录到目标用户的会话,然后启动程序。
-
切换用户:
- 使用“切换用户”功能登录到另一个用户会话,然后启动程序。
-
任务计划程序:
- 配置任务计划程序在目标用户的会话中运行任务,并确保“仅在用户登录时运行”选项被选中。
- 服务化