以不同用户身份运行程序,/savecred只需要输入一次密码(GetTokenByName取得EXPLORER.EXE的令牌,然后调用CreateProcessAsUser,而且使用LoadUserProfile解决另存文件的问题)good
http://blog.sina.com.cn/s/blog_65977dde0100s7tm.html
--------------------------------------------------
以不同用户身份运行程序
CCProxy -reboot 重启软件
CCProxy -reset 更新配置
CCProxy -update 更新帐号
试着改了AccInfo.ini中帐号信息,在DOS中运行CCProxy -update的确更新了账号,所以开始用PHP做管理工具,做到调用CCProxy -update时,用了PHP中的exec(),system()等函数一直没有效果,后又通过调用批处理文件来调用命令行参数都不行。 处理得正没耐心的时候,一气之下狂刷新PHP网页,电脑卡死,用进程管理器查看时发现打开了多个CCProxy进程,认真一看,除了一个CCProxy是用户进程外其它CCProxy全是system进程。认真一想有可能是运行用户身份不同所产生的结果。
Apache服务调用的外部程序以system身份运行,自己双击运行的程序以用户身份运行。 如 果CCProxy -update以用户身份运行是不是就可以了呢?本人在网络上找到了runas这个命令,的确可以指定以哪个用户运行,但是每次都要输密码,没有密码的帐号就要加上密码才可以用,“/savecred”这个参数可以用,只要输入一次密码就可以了,但在PHP中发现要以system的身份输入一次才行,根本 没有机会输入。打算用C程序来处理这个问题。可是发现用WinExec(),ShellExecute(),CreateProcess()都不好处理这个问题,好在发现了CreateProcessAsUser()这个函数。把网络上的程序改了几处,编译后一试问题终于解决。
以下为相关代码:
// Update.cpp : 定义控制台应用程序的入口点。
- #include "stdafx.h"
- #include <windows.h>
- #include <tlhelp32.h>
- BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName)
- {
- if(!lpName)
- return FALSE;
- HANDLE hProcessSnap = NULL;
- BOOL bRet = FALSE;
- PROCESSENTRY32 pe32 = {0};
- hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
- if (hProcessSnap == INVALID_HANDLE_VALUE)
- return (FALSE);
- pe32.dwSize = sizeof(PROCESSENTRY32);
- if (Process32First(hProcessSnap, &pe32))
- {
- do
- {
- if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName))) // 改成大写
- {
- HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
- FALSE,pe32.th32ProcessID);
- bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);
- CloseHandle (hProcessSnap);
- return (bRet);
- }
- }
- while (Process32Next(hProcessSnap, &pe32));
- bRet = TRUE;
- }
- else
- bRet = FALSE;
- CloseHandle (hProcessSnap);
- return (bRet);
- }
- BOOL RunProcess(LPCSTR lpImage,LPSTR lpCommandLine)
- {
- if(!lpImage)
- return FALSE;
- HANDLE hToken;
- if(!GetTokenByName(hToken,"EXPLORER.EXE"))
- return FALSE;
- STARTUPINFO si;
- PROCESS_INFORMATION pi;
- ZeroMemory(&si, sizeof(STARTUPINFO));
- si.cb= sizeof(STARTUPINFO);
- si.lpDesktop = TEXT("winsta0\\default");
- BOOL bResult = CreateProcessAsUser(hToken,lpImage, lpCommandLine,NULL,NULL,
- FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
- CloseHandle(hToken);
- if(bResult)
- {
- OutputDebugString("CreateProcessAsUser ok!\r\n");
- printf("CreateProcessAsUser ok!\r\n");
- }
- else
- {
- OutputDebugString("CreateProcessAsUse* **lse!\r\n");
- printf("CreateProcessAsUse* **lse!\r\n");
- }
- return bResult;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- RunProcess("CCProxy.exe"," -update");
- return 0;
- }
谢谢 :)
2楼 santalence 2009-05-23 17:29发表 [回复]
这个方法确实很好,to aguiwang :解决 GetSaveFileName 的问题,可在调用CreateProcessAsUser前调用下面这个函数:
BOOL LoadProfile(HANDLE hToken, LPTSTR lpszUserName)
{
BOOL bRet = FALSE;
PROFILEINFO pi;
pi.dwSize = sizeof(PROFILEINFO);
pi.dwFlags = 0;
pi.lpUserName = lpszUserName;
pi.lpDefaultPath = NULL;
pi.lpPolicyPath = NULL;
pi.lpServerName = NULL;
pi.lpProfilePath = NULL;
bRet = ::LoadUserProfile(hToken, &pi);
return bRet;
}
其中的lpszUsername 就是当前登陆用户名
1楼 aguiwang 2006-08-30 09:00发表 [回复]
idAnts的方法很好,但这样从服务里用CreateProcessAsUser创建的进程,还是有调用者的性质.比如在创建出来的进程里弹出Save file的common dialog是(即调用API GetSaveFileName),上面的桌面和我的文件夹还是LocalService下的,而不是当前登陆用户下的.而Localservice又没有桌面和我的文件夹目录,所以在选择桌面和我的文件夹时common dialog会出现这样的错误提示错误.C:/documents and settings/localservice/desktop refers to a location that is unavailable. It could be on a hard drive on this computer,on a network, or on a different computer on your home network. Check to make sure that the disk is properly inserted, or that you are connected to the Internet or home network, and then try again.
以不同用户身份运行程序,/savecred只需要输入一次密码(GetTokenByName取得EXPLORER.EXE的令牌,然后调用CreateProcessAsUser,而且使用LoadUserProfile解决另存文件的问题)good的更多相关文章
- Linux 下以其他用户身份运行程序—— su、sudo、runuser
本文综合分析了Linux系统下,如何使用runuser命令.su命令和sudo命令以其他用户身份来运行程序,以及这三个命令的运行效率比较. 一.su 命令临时切换用户身份 SU:( Switch ...
- [原创]Win7、Win8、Win10始终以管理员身份运行程序。
在Win7.Win8.Win10系统中,以管理员身份运行程序很麻烦,一般有以下几种方式: 1.在可执行程序或快捷方式上右键,以管理员身份运行: 2.在可执行程序或快捷方式上右键->属性-> ...
- Win7、Win8、Win10始终以管理员身份运行程序。
在Win7.Win8.Win10系统中,以管理员身份运行程序很麻烦,一般有以下几种方式: 1.在可执行程序或快捷方式上右键,以管理员身份运行: 2.在可执行程序或快捷方式上右键->属性-> ...
- xcode运行push通知总是提示输入用户名和密码
xcode运行push通知总是提示输入用户名和密码,目前找到的解决方案是, 打开钥匙串,然后找到push证书下面的私有密钥,双击进入将访问控制设置为允许全部访问,即可.
- C# 管理员身份运行程序
在使用winform程序获取调用cmd命令提示符时,如果是win7以上的操作系统,会需要必须以管理员身份运行才会执行成功,否则无效果或提示错误. 比如在通过winform程序执行cmd命令时,某些情况 ...
- C#以管理员身份运行程序
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; names ...
- 【CITE】C#默认以管理员身份运行程序实现代码
//用于一种情况:C#软件打包后,在读写C盘文件时,会出现权限问题.使用管理员身份才可以运行 using System; using System.Collections.Generic; using ...
- C#如何以管理员身份运行程序
在使用winform程序获取调用cmd命令提示符时,如果是win7以上的操作系统,会需要必须以管理员身份运行才会执行成功,否则无效果或提示错误. 比如在通过winform程序执行cmd命令时,某些情况 ...
- C# 之 判断或设置以管理员身份运行程序
一.判断程序是否以管理员权限运行 using System.Security.Principal; public bool IsAdministrator() { WindowsIdentity cu ...
随机推荐
- linux系统启动
在本文中,我们按电源按钮简要叙述,以便能够登录到系统,在此期间,系统和计算机硬件是如何一起工作.既作为自己整理知识的摘要,有可能linux0绍,高手请略过. 一般来说linux的启动能够分成三个阶段: ...
- linux innode图解2
http://www.opsers.org/linux-home/base/the-knowledge-that-one-day-learn-linux-file-system.html 文件系统是操 ...
- linux块设备IO栈浅析
http://www.sysnote.org/2015/08/06/linux-io-stack/
- [Android 中级]Voip之CSipSimple类库的编绎
CSipSimple是什么?是一款基于pjsip的Android客户端,相信想要研究VOIP通讯的朋友一定不会陌生,这里我就把如何编译CSipSimple写下来. 首先从CSipSimple官方网站上 ...
- (转载)linux那点事儿(上)
原文地址:http://www.cnblogs.com/fnng/archive/2012/03/19/2407162.html 本文只是转载供自己学习之用 本文算是学linux的学习笔记吧!其实li ...
- 观察者模式在ng(Angular)中的应用
在这个前端框架满天飞的天下,angular MVVM 的模式确实火了一把,所以最近一直在学习ng,感悟颇多,填坑无数,今天终静下心来打算更新自己久未变动的博客,做一做总结. 1.在ng中的观察者模式: ...
- python - 操作RabbitMQ
python - 操作RabbitMQ 介绍 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议.MQ全称为Mess ...
- .net开发windows服务
最近一个月都异常的繁忙,项目进度非常的紧,回头看看自己的blog,整整一个5月都没有一篇文章,非常惭愧,现在补几篇文章,介绍一下我最近关注的技术.这篇文章将介绍Windows服务程序的开发.摘要:本文 ...
- 那些年,我们一起学WCF--(7)PerSession实例行为
这一节,大家了解下PerSession实例行为,PerSession表示会话实例行为,当客户端调用服务器后,服务器端会为客户端分配一个新的服务实例,这个实例在服务器端SESSION时间过期后将失效.客 ...
- VMware Workstation 11序列号一枚
VMware Workstation 11序列号: 1F04Z-6D111-7Z029-AV0Q4-3AEH8