system服务程序下 模拟当前用户,获得开始菜单 桌面路径等

                     服务应用程序如何访问当前登录用户的信息

以服务权限,即SYSTEM帐户启动的程序是无法取得用户的profile的,比如startup文件夹的路径。

首先,Shell函数是不行的:


SHGetSpecialFolderPath取得的是C:\Windows\system32\config\systemprofile\

其次,环境变量也得不到。

GetEnvironmentVariable返回203( ERROR_ENVVAR_NOT_FOUND)


注:从服务应用程序可以拿到全局的环境变量,诸如ALLUSERS等等,但是各个用户的就搞不定了。

虽说从服务来访问用户的profile是一种非常不好的设计,但是如果有一些特殊需求的话,,

可以使用下面的方法。

BOOL bRes = FALSE;
char lpPath[MAX_PATH];
DWORD RetVal           = 0;
DWORD ErrCode          = 0;
DWORD ConsoleSessionId = 0;
// 函数的句柄
HMODULE hInstKernel32    = NULL;
HMODULE hInstWtsapi32    = NULL;
// Token的句柄
HANDLE hTokenUser        = NULL;
HANDLE hTokenThisProcess = NULL;
HANDLE hTokenThis        = NULL;
// WTSGetActiveConsoleSessionId 函数,得到当前登录用户的会话ID
// 这里的代码用的是VC6,新版的SDK已经包括此函数,无需LoadLibrary了。
typedef DWORD (WINAPI *WTSGetActiveConsoleSessionIdPROC)();
WTSGetActiveConsoleSessionIdPROC WTSGetActiveConsoleSessionId = NULL;
hInstKernel32 = LoadLibrary("Kernel32.dll");
if (!hInstKernel32)
{
return FALSE;
}
WTSGetActiveConsoleSessionId = (WTSGetActiveConsoleSessionIdPROC)GetProcAddress(hInstKernel32,"WTSGetActiveConsoleSessionId");
if (!WTSGetActiveConsoleSessionId)
{
return FALSE;
}
// WTSQueryUserToken 函数,通过会话ID得到令牌
typedef BOOL (WINAPI *WTSQueryUserTokenPROC)(ULONG SessionId, PHANDLE phToken );
WTSQueryUserTokenPROC WTSQueryUserToken = NULL;
hInstWtsapi32 = LoadLibrary("Wtsapi32.dll");
if (!hInstWtsapi32)
{
return FALSE;
}
WTSQueryUserToken = (WTSQueryUserTokenPROC)GetProcAddress(hInstWtsapi32,"WTSQueryUserToken");
if (!WTSQueryUserToken)
{
return FALSE;
}
// 得到当前激活用户的会话ID
ConsoleSessionId = WTSGetActiveConsoleSessionId();
// 得到当前登录用户的令牌
bRes = WTSQueryUserToken( ConsoleSessionId, &hTokenUser);
if (!bRes)
{
return FALSE;
}
// 模仿成当前登录用户
bRes = ImpersonateLoggedOnUser(hTokenUser);
if (!bRes)
{
return FALSE;
}

// 取得当前用户的Startup文件夹路径

bRes = SHGetSpecialFolderPath(NULL,lpPath,CSIDL_STARTUP,TRUE);//CSIDL_STARTUP  表示的是开始菜单

if (!bRes)

{

return FALSE;
}
else
{
MessageBox(NULL,lpPath,"Startup",MB_OK);
}
// 终止模拟,返回
RevertToSelf();

我也是看的别人博客   ,试了一下可以。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值