win7管理员权限有关问题

win7管理员权限问题
在win7下用管理员进程都知道会有一个“用户账户控制提醒”,如何让我的程序屏闭掉这个提醒呢,
尝试过一个方法,创建一个服务,因为服务一定是管理员运行的,在服务里去启动我的进程,启动起来的进程应该是有管理员权限的,但是会有一个问题,因为我的程序是有界面的,这样的话,只能看到进程,看不到界面。
win7管理员权限有关问题路过的有没有好好的建议。

------解决方案--------------------
在服务中用管理员权限创建一个可弹出UI的进程:http://blog.****.net/woshinia/article/details/7850295
------解决方案--------------------
服务提权可以的, 而且界面有什么关系, 开机启动只要判断explorer进程在 然后在开始启动界面程序就可以了
------解决方案--------------------
void OnServer()
{
HANDLE hToken = NULL;
if (!GetTokenByProcessName(hToken, _T("EXPLORER.EXE")))
{
continue;
}
::KsWriteLog("查找EXPLORER成功");
SECURITY_DESCRIPTOR  sd;
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, TRUE, (PACL)NULL, FALSE);

SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = &sd;

CString strAppName = _T("C:\\Program Files\\DecoderServer\\DecoderService.exe");//strModulePath + _T("testAutoStart.exe");


//STARTUPINFOEX siEx;

HANDLE ProcessHandle = NULL;   
HANDLE CurrentToken = NULL;   
HANDLE TokenDup = NULL;   
ProcessHandle = GetCurrentProcess();   
if (!OpenProcessToken(ProcessHandle, TOKEN_ALL_ACCESS, &CurrentToken))   
{      
::TRACE1("OpenProcessToken failed.Last Error is:%d", GetLastError());   
continue;   
}   
if (!DuplicateTokenEx(CurrentToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &TokenDup))   
{     
::TRACE1("DuplicateTokenEx failed.Last error is:%d", GetLastError());   
continue;   
}   
DWORD dwSessionID = WTSGetActiveConsoleSessionId();   
::KsWriteLog("WTSGetActiveConsoleSessionId:%d", dwSessionID);   
if (!SetTokenInformation(TokenDup, TokenSessionId, &dwSessionID, sizeof(DWORD)))   
{     
::TRACE1("SetTokenInformation failed.Last error is:%d", GetLastError());   
continue;   
}

LPVOID pEnv = NULL;    
DWORD dwCreationFlags = NORMAL_PRIORITY_CLASS 
------解决方案--------------------
 CREATE_NEW_CONSOLE 
------解决方案--------------------
 CREATE_UNICODE_ENVIRONMENT 
------解决方案--------------------
 EXTENDED_STARTUPINFO_PRESENT;
if (!CreateEnvironmentBlock(&pEnv, TokenDup, FALSE))   
{   
int error1 = GetLastError();   
::TRACE1("CreateEnvironmentBlock failed.Last error is:%d", GetLastError());   
continue;   



STARTUPINFOEX si;
memset(&si,0, sizeof(si));
si.StartupInfo.cb = sizeof(si);
si.StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
si.StartupInfo.wShowWindow = SW_NORMAL;
si.StartupInfo.lpDesktop = _T("WinSta0\\Default");
PROCESS_INFORMATION pi;

::TRACE1("TokenDup  %0x\n", TokenDup);
if (!CreateProcessAsUser(TokenDup, strAppName, NULL, &sa, &sa, FALSE, dwCreationFlags, pEnv, strModulePath, (STARTUPINFO*)&si, &pi))
{
::TRACE1("%d", GetLastError());
CloseHandle(hToken);
continue;
}
::KsWriteLog("启动其他进程成功");
CloseHandle(hToken);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
DestroyEnvironmentBlock(pEnv);
pEnv = NULL;   
CloseHandle(ProcessHandle);   
CloseHandle(TokenDup); 
}




------解决方案--------------------
int CheckProccessExist(wchar_t *p)
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);

HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
//::KsWriteLog("CreateToolhelp32Snapshot error");
return -1;
}

BOOL bProcess = Process32First(hProcessSnap, &pe32);
while (bProcess)