目前好象只能使用LogonUser,如果你熟悉LSA API的话或许LSA好用一些,但太复杂了。
进程调用LogonUser需要有SE_TCB_NAME特权,在特定情况下也需要
SE_CHANGE_NOTIFY_NAME特权。
获得特权可以参考下面的示例:
if( !OpenProcessToken(
GetCurrentProcess(),
TOKEN_QUERY | TOKEN_ADJUST_DEFAULT | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_PRIVILEGES,
&hProcessToken ) )
// Error Process;
if( !LookupPrivilegeValueA( NULL, lpPrivilegeName, &(tp.Privileges[0].Luid) ) )
// Error Process;
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if( !AdjustTokenPrivileges(
hProcessToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES) + sizeof( LUID_AND_ATTRIBUTES ) * 2,
NULL,
NULL ) )
// Error Process;
CloseHandle( hProcessToken );
当然了,启动进程的帐号也要有相应的特权,可以使用用户管理器设定,或通过
程序设定,类似上面的代码。