win7管理员权限有关问题
win7管理员权限问题
在win7下用管理员进程都知道会有一个“用户账户控制提醒”,如何让我的程序屏闭掉这个提醒呢,
尝试过一个方法,创建一个服务,因为服务一定是管理员运行的,在服务里去启动我的进程,启动起来的进程应该是有管理员权限的,但是会有一个问题,因为我的程序是有界面的,这样的话,只能看到进程,看不到界面。
路过的有没有好好的建议。
------解决方案--------------------
在服务中用管理员权限创建一个可弹出UI的进程:http://blog.****.net/woshinia/article/details/7850295
------解决方案--------------------
服务提权可以的, 而且界面有什么关系, 开机启动只要判断explorer进程在 然后在开始启动界面程序就可以了
------解决方案--------------------
------解决方案--------------------
在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)