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

转自:http://hi.baidu.com/robinwjbgui/blog/item/7ab0a213b2b2bf866438db10.html

 

以服务权限,即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);
if ( ! bRes)
{

       return FALSE;

}
else
{

       MessageBox( NULL , lpPath , "Startup" , MB_OK);

}


// 终止模拟,返回
RevertToSelf();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值