create an process with administrator privilege from service in Vista

本文详细介绍了如何使用WTSGetActiveConsoleSessionId、WTSQueryUserToken、DuplicateTokenEx等Windows API函数获取当前会话的管理员令牌,并通过createProcessAsUser创建具有管理员权限的用户进程。

 I did it as the following:
1.Get the session if of the active console user (WTSGetActiveConsoleSessionId)
2.Get the user's token (WTSQueryUserToken),the user has administrator privilege

3.duplicate the token ((DuplicateTokenEx)
4.Get the linked token of ther user token. The linked token has admin privilege.
-----------------------------------------------------------------------------------------------------------------------------------------
TOKEN_LINKED_TOKEN admin;
GetTokenInformation(hUserToken, TokenLinkedToken, &admin, sizeof(TOKEN_LINKED_TOKEN), &len)) ;
 HANDLE AdminToken = admin.LinkedToken;
--------------------------------------------------------------------------------------------------------------------------------------------

5. create the user process (createProcessAsUser)

http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/6fcdff4d-7c63-4ea0-b883-5a660ec8d4af
在更新程序过程中,若出现 `Updater cannot rename Software folder due to another process locking it` 错误提示,通常表示目标文件夹正在被某个进程占用,导致无法进行重命名或替换操作。此类问题常见于 Windows 操作系统环境中,尤其是在自动更新或手动安装软件时。 ### 常见原因分析 1. **文件资源管理器打开**:如果文件夹或其中的文件正在被资源管理器预览或访问,可能会造成锁定。 2. **第三方软件占用**:例如杀毒软件、同步工具(如 OneDrive)、备份程序等可能对文件夹进行实时扫描或监控。 3. **后台服务或进程运行**:某些应用程序的服务或守护进程可能正在使用该目录中的文件。 4. **命令行工具或脚本运行中**:CMD、PowerShell 或其他脚本工具如果当前路径指向该文件夹,也可能造成锁定。 ### 解决方案 #### 1. 手动查找并结束锁定进程 可以使用以下方法识别并终止占用文件夹的进程: - **使用资源监视器(Resource Monitor)**: - 打开“开始菜单”,搜索并打开“资源监视器”。 - 切换到“CPU”标签页,点击“关联的句柄”搜索框,输入目标文件夹名称。 - 查找相关进程后右键选择“结束进程”[^1]。 - **使用命令行工具**: ```powershell handle.exe "C:\Path\To\Software" ``` `handle.exe` 是 Sysinternals 工具包中的一个实用程序,可显示哪个进程锁定了指定路径。找到 PID 后,可通过任务管理器结束对应进程。 #### 2. 使用批处理脚本延迟重命名操作 在自动化更新流程中,可以添加等待机制或尝试多次重命名以规避临时锁定问题: ```batch @echo off setlocal set FOLDER="C:\Program Files\MyApp\Software" set NEWNAME="C:\Program Files\MyApp\Software_old" for /l %%x in (1,1,5) do ( if exist %FOLDER% ( echo Attempt %%x to unlock and rename... timeout /t 3 >nul ren %FOLDER% Software_old if not errorlevel 1 goto :done ) ) echo Failed to rename after multiple attempts. exit /b 1 :done echo Successfully renamed. ``` #### 3. 使用 PowerShell 脚本检测锁定状态 ```powershell $folder = "C:\Path\To\Software" $locked = $true $attempts = 0 while ($locked -and $attempts -lt 5) { try { $file = [System.IO.File]::Open($folder, 'Open', 'Read', 'None') $file.Close() $locked = $false } catch { Write-Host "Folder is locked. Waiting..." Start-Sleep -Seconds 3 $attempts++ } } if (-not $locked) { Rename-Item -Path $folder -NewName "Software_new" } else { Write-Host "Unable to unlock folder." } ``` #### 4. 系统级解决方案 - **重启系统后更新**:确保在系统启动初期执行更新操作,此时大多数用户级进程尚未运行。 - **使用安全模式更新**:进入安全模式后运行更新程序,避免第三方软件干扰。 - **关闭第三方监控软件**:临时禁用杀毒软件、云同步工具等可能锁定文件的程序。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值