锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鏈潵鍦╒ista涔嬪墠鏈嶅姟涓庢闈簰浜ゆ槸涓浠跺緢瀹規(guī)槗鐨勪簨鎯?鑷粠Vista鎶婃湇鍔¢兘鎸埌Session 0
涓繍琛屽幓鑰屼笖涓嶅彲浠ヨ法Session涔嬪悗,闂灝卞鏉備簡璁稿,鏈夋椂鍊欐垜灝卞湪鎯寵繖浜涢棶棰樻槸鍚︾湡鐨勪笉寰椾笉瑙e喅鑰屼笖浼間箮瀵逛簬瀹夊叏騫舵湭甯︽潵澶氬ぇ鎻愬崌鐨勬洿鏀規(guī)繪槸璁╀漢
澶寸柤,Google浜嗕竴浜涙枃妗?鎶勮浜嗕笉灝戜唬鐮佹垜鏄涓嬪疄鐜扮殑 榪欎釜鍑芥暟鎶勮嚜winehq緗戠珯,欏轟究涓嶅緱涓嶈涓涓媤inehq鐨勪唬鐮佹槸寰堝煎緱鍙傝冪殑 EnablePrivilege鐢ㄦ潵鎻愬崌鏈繘紼嬫潈闄?鍥犱負鎴戜滑鐨勬牳蹇冩濊礬鏄敤CreateProcessAsUser鍒涘緩榪涚▼鍒伴渶瑕佷簰浜ょ殑Session,
2 {
3 TOKEN_PRIVILEGES Privileges;
4 HANDLE hToken;
5 BOOL bResult;
6 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
7 return FALSE;
8
9 Privileges.PrivilegeCount = 1;
10 Privileges.Privileges[0].Attributes = (bEnable) ? SE_PRIVILEGE_ENABLED : 0;
11
12 if (!LookupPrivilegeValue(NULL, lpPrivilegeName,
13 &Privileges.Privileges[0].Luid))
14 {
15 CloseHandle(hToken);
16 return FALSE;
17 }
18
19 bResult = AdjustTokenPrivileges(hToken, FALSE, &Privileges, 0, NULL, NULL);
20
21 CloseHandle(hToken);
22
23 return bResult;
24 }
EnablePrivilege(SE_TCB_NAME, TRUE);
EnablePrivilege(SE_CHANGE_NOTIFY_NAME, TRUE);
EnablePrivilege(SE_INCREASE_QUOTA_NAME, TRUE);
EnablePrivilege(SE_ASSIGNPRIMARYTOKEN_NAME, TRUE);
//鑾峰彇褰撳墠榪涚▼鐨勭伒鐗?/span>
HANDLE hTokenThis = NULL;
HANDLE hTokenDup = NULL;
HANDLE hThisProcess = GetCurrentProcess();
OpenProcessToken(hThisProcess, TOKEN_ALL_ACCESS, &hTokenThis);
//澶嶅埗浠ょ墝
DuplicateTokenEx(hTokenThis, MAXIMUM_ALLOWED,NULL, SecurityIdentification, TokenPrimary, &hTokenDup);
//鏋氫婦鎵鏈塖ession,鏈潵榪樻湁涓涓猈TSGetActiveConsoleSessionId,涓嶈繃榪欎釜鍑芥暟鍦╳in2000涓嬪彧鏈塖erver鐗堟湰瀹夎WTS鎵嶅彲浠?/span>
PWTS_SESSION_INFO pSInfo;
DWORD pCInfo = 0;
WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE,0,1,&pSInfo,&pCInfo);
DWORD dwSessionId = 0;
for (int i=0;i<pCInfo;i++)
{
if (pSInfo[i].State == WTSActive)
{
dwSessionId = pSInfo[i].SessionId;
break;
}
}
//DWORD dwSessionId = WTSGetActiveConsoleSessionId();
//鏇挎崲浠ょ墝,鍏抽敭鍦版柟,鎴戜滑騫朵笉闇瑕佷互Session鐢ㄦ埛鍒涘緩榪涚▼,鍙渶瑕佹浛鎹護鐗屽氨鍙互浜?/span>
SetTokenInformation(hTokenDup, TokenSessionId, &dwSessionId, sizeof(DWORD));
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof(si);
si.lpDesktop = "WinSta0\\Default";
DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT;
char pPath[MAX_PATH*2];
GetModuleFileName(NULL,pPath,sizeof(pPath));
strcat(pPath," -work");
LPVOID pEnv;
CreateEnvironmentBlock(&pEnv,hTokenDup,FALSE);
if (!CreateProcessAsUser(hTokenDup,NULL,pPath,NULL,NULL,FALSE,dwCreationFlag,pEnv,NULL,&si,&pi))
{
//
// int p = GetLastError();
// p = 0;
}
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(hTokenDup);
CloseHandle(hTokenThis);
榪欐牱鎴戜滑鐨勭▼搴忓氨鍙互鍜屾闈簰浜や簡,榪欏彧鏄牳蹇?鍏朵綑鐗墊秹澶氱敤鎴峰垏鎹㈣繖浜涜繕闇瑕佸彟澶栬冭檻
]]>
Semaphore鏄棗璇殑鎰忔濓紝鍦╓indows涓紝Semaphore瀵硅薄鐢ㄦ潵鎺у埗瀵硅祫婧愮殑騫跺彂璁塊棶鏁般係emaphore瀵硅薄鍏鋒湁涓涓鏁板鹼紝褰撳煎ぇ浜?鏃訛紝Semaphore琚疆淇″彿錛屽綋璁℃暟鍊肩瓑浜?鏃訛紝Semaphore琚竻闄や俊鍙楓傛瘡嬈¢拡瀵筍emaphore鐨剋ait functions榪斿洖鏃訛紝璁℃暟鍊艱鍑?錛岃皟鐢≧eleaseSemaphore鍙互灝嗚鏁板煎鍔?lReleaseCount 鍙傛暟鍊兼寚瀹氱殑鍊箋?
CreateSemaphore鍑芥暟鐢ㄤ簬鍒涘緩涓涓猄emaphore
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG lInitialCount,
LONG lMaximumCount,
LPCTSTR lpName
);
lpSemaphoreAttributes涓哄畨鍏ㄥ睘鎬э紝
lInitialCount涓篠emaphore鐨勫垵濮嬪鹼紝
lMaximumCount涓烘渶澶у鹼紝
lpName涓篠emaphore瀵硅薄鐨勫悕瀛楋紝NULL琛ㄧず鍒涘緩鍖垮悕Semaphore
姝ゅ榪樺彲浠ヨ皟鐢∣penSemaphore鏉ユ墦寮宸茬粡鍒涘緩鐨勯潪鍖垮悕Semaphore
HANDLE OpenSemaphore(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName
);
璋冪敤ReleaseSemaphore澧炲姞Semaphore璁$畻鍊?
BOOL ReleaseSemaphore(
HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount
);
lpReleaseCount鍙傛暟琛ㄧず瑕佸鍔犵殑鏁板鹼紝
lpPreviousCount鍙傛暟鐢ㄤ簬榪斿洖涔嬪墠鐨勮綆楀鹼紝濡傛灉涓嶉渶瑕佸彲浠ヨ緗負NULL
姣斿鎴戜滑瑕佹帶鍒跺埌鏈嶅姟鍣ㄧ殑榪炴帴鏁頒笉瓚呰繃10涓紝鍙互鍒涘緩涓涓猄emaphore錛屽垵鍊間負10錛屾瘡褰撹榪炴帴鍒版湇鍔″櫒鏃訛紝浣跨敤WaitForSingleObject璇鋒眰Semaphore錛屽綋鎴愬姛榪斿洖鍚庡啀灝濊瘯榪炴帴鍒版湇鍔″櫒錛屽綋榪炴帴澶辮觸鎴栬繛鎺ヤ嬌鐢ㄥ畬鍚庨噴鏀炬椂錛岃皟鐢≧eleaseSemaphore澧炲姞Semaphore璁℃暟鍊箋?
銆銆Event鍗充簨浠舵槸涓縐嶇敤浜庤繘琛岀嚎紼?榪涚▼闂村悓姝ョ殑瀵硅薄錛屼簨浠舵湁緗綅鍜屽浣嶄袱縐嶇姸鎬侊紝褰撶嚎紼嬮氳繃waiting functions絳夊緟Event瀵硅薄緗綅鏃惰綰跨▼灝嗚繘鍏ラ樆濉炵姸鎬侊紝褰撹Event瀵硅薄琚疆浣嶆垨絳夊緟瓚呮椂鍚庯紝絳夊緟鐨勭嚎紼嬪皢鎭㈠鎵ц銆侲vent鍙互鐢ㄥ湪涓涓嚎紼嬭絳夊緟鍏跺畠綰跨▼鏃躲?br>鍙互浣跨敤CreateEvent鍒涘緩Event瀵硅薄
HANDLE WINAPI CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPCTSTR lpName
);
lpEventAttributes鐢ㄤ簬鎸囧畾Event瀵硅薄鐨勫畨鍏ㄥ睘鎬э紝鍖呮嫭鍙ユ焺鏄惁鍙瀛愯繘紼嬬戶鎵垮拰瀵硅薄鐨勫畨鍏ㄦ弿榪扮銆傚彲璁劇疆NULL鍙栭粯璁ゅ畨鍏ㄥ睘鎬с?br>bManualReset琛ㄦ槑Event瀵硅薄鏄惁闇瑕佹墜鍔ㄥ浣嶃傚鏋滆鍙傛暟涓篢RUE錛屽垯Event瀵硅薄闇瑕侀氳繃ResetEvent鍑芥暟鎵嬪姩澶嶄綅銆傚鏋滆鍙傛暟涓篎ALSE錛屽垯Event琚垱寤轟負鑷姩澶嶄綅鐨凟vent錛屼換浣曠瓑寰呯殑綰跨▼琚仮澶嶆墽琛屽悗錛岃Event灝嗚緋葷粺鑷姩澶嶄綅銆傛墦涓瘮鏂癸紝濡傛灉鏈?0涓嚎紼嬪湪絳夊緟涓涓狤vent錛岃繖鏃跺皢Event緗綅錛屽鏋滆繖鏄釜鎵嬪姩澶嶄綅Event錛岄偅涔堣繖10涓嚎紼嬪皢琚緷嬈″敜閱掔洿鍒伴氳繃ResetEvent璋冪敤灝嗚Event澶嶄綅錛涘鏋淓vent涓鴻嚜鍔ㄥ浣岴vent錛岄偅涔?0涓嚎紼嬩腑鐨勭涓涓鍞ら啋鍚嶦vent琚嚜鍔ㄥ浣嶏紝鍏跺畠綰跨▼灝嗙戶緇瓑寰呫?br>bInitialState鍙傛暟琛ㄦ槑Event瀵硅薄琚垱寤哄悗榛樿鏄惁緗綅銆?br>lpName鍙傛暟鏄疎vent鐨勫悕瀛楋紝鍙互涓虹┖琛ㄦ槑灝嗗垱寤哄尶鍚岴vent銆?br>CreateEvent鍑芥暟鍦ㄨ皟鐢ㄦ垚鍔熷悗榪斿洖Event鍙ユ焺銆傚鏋滃悓鍚岴vent宸茬粡瀛樺湪錛屽垯榪斿洖榪欎釜宸茬粡瀛樺湪浜嗙殑Event鐨勫彞鏌勶紝姝ゆ椂璋冪敤GetLastError鍑芥暟灝嗚繑鍥?ERROR_ALREADY_EXISTS銆?br>榪樺彲浠ラ氳繃OpenEvent鎵撳紑涓涓凡緇忓垱寤虹殑闈炲尶鍚岴vent
HANDLE WINAPI OpenEvent(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName
);
鍦ㄥ垱寤烘垨鎵撳紑浜咵vent瀵硅薄涔嬪悗錛屽彲浠ヤ嬌鐢⊿etEvent鍜孯esetEvent鍑芥暟鏉ョ疆浣嶆垨澶嶄綅涓涓狤vent瀵硅薄銆?br>BOOL WINAPI SetEvent(
HANDLE hEvent
);
BOOL WINAPI ResetEvent(
HANDLE hEvent
);
瑕佺瓑寰呬竴涓垨澶氫釜Event瀵硅薄緗綅鍙互浣跨敤wait functions銆?br>綆鍗曠ず渚嬶紝涓涓嚎紼嬩笉鍋滆鍙栫敤鎴瘋緭鍏ュ茍鏀懼叆message鍒楄〃錛屽彟涓涓嚎紼嬫ā鎷熷皢message鍙戦佸嚭鍘伙紝濡傛灉娌℃湁娑堟伅錛屽垯鍙戦佺嚎紼嬪浜庨樆濉炵姸鎬佺瓑寰咃紝涓鏃︽湁娑堟伅褰曞叆錛岃緭鍏ョ嚎紼嬪皢event緗綅錛屽彂閫佺嚎紼嬪嵆琚縺媧誨茍閫愪釜鍙戦佹秷鎭?br>#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <iostream>
#include <list>
#include <string>
using namespace std;
#ifdef _UNICODE
typedef wstring tstring;
#define tcout wcout
#define tcin wcin
#else
typedef string tstring;
#define tcout cout
#define tcin cin
#endif /* _UNICODE */
typedef list<tstring> StringList;
HANDLE hMutex = NULL;
HANDLE hEvent = NULL;
HANDLE hSendThread = NULL;
StringList messages;
bool isRunning;
DWORD WINAPI SendThreadProc(LPVOID lpThreadParameter)
{
DWORD dw;
while(isRunning)
{
dw = WaitForSingleObject(hEvent, INFINITE);
if(dw != WAIT_OBJECT_0)
{
tcout << _T("Wait error.") << endl;
return -1;
}
dw = WaitForSingleObject(hMutex, INFINITE);
if(WAIT_OBJECT_0 != dw && WAIT_ABANDONED != dw)
{
tcout << _T("Wait error.") << endl;
return -2;
}
StringList list(messages);
messages.clear();
ReleaseMutex(hMutex);
for(StringList::iterator i = list.begin(); i != list.end(); i++)
{
Sleep(1000); //浼戠湢1縐掓ā鎷熷彂閫佹墍鑰楁椂闂?
tcout << _T("/* Send Message:") << *i << _T(" */");
}
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
hMutex = CreateMutex(NULL, FALSE, NULL);
hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
isRunning = true;
hSendThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SendThreadProc, NULL, 0, NULL);
while(isRunning)
{
tstring s;
tcin >> s;
if(s == _T("quit"))
{
isRunning = true;
break;
}
DWORD dw = WaitForSingleObject(hMutex, INFINITE);
if(WAIT_OBJECT_0 != dw && WAIT_ABANDONED != dw)
{
tcout << _T("Wait error.") << endl;
return -1;
}
messages.push_back(s);
ReleaseMutex(hMutex);
SetEvent(hEvent);
}
CloseHandle(hMutex);
CloseHandle(hEvent);
CloseHandle(hSendThread);
return 0;
}
Mutex鏄簰鏂ヤ綋鐨勬剰鎬濓紝褰撲竴涓嚎紼嬫寔鏈変竴涓狹utex鏃訛紝鍏跺畠綰跨▼鐢寵鎸佹湁鍚屼竴涓狹utex浼氳闃誨錛屽洜姝ゅ彲浠ラ氳繃Mutex鏉ヤ繚璇佸鏌愪竴璧勬簮鐨勪簰鏂ヨ闂紙鍗沖悓涓鏃墮棿鏈澶氬彧鏈変竴涓嚎紼嬭闂級銆?br>璋冪敤CreateMutex鍙互鍒涘緩鎴栨墦寮涓涓狹utex瀵硅薄錛屽叾鍘熷瀷濡備笅
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCTSTR lpName
);
鍏朵腑鍙傛暟l(fā)pMutexAttributes鐢ㄦ潵璁懼畾Mutex瀵硅薄鐨勫畨鍏ㄦ弿榪扮鍜屾槸鍚﹀厑璁稿瓙榪涚▼緇ф壙鍙ユ焺銆俠InitialOwner琛ㄦ槑鏄惁灝哅utex鐨勬寔鏈夎呰緗負璋冪敤綰跨▼銆俵pName鍙傛暟璁劇疆Mutex鐨勫悕瀛楋紝璇ュ悕瀛楀尯鍒嗗ぇ灝忓啓騫朵笉鑳藉寘鍚?\"錛屾渶澶ч暱搴︿負MAX_PATH錛屽彲璁劇疆涓篘ULL琛ㄦ槑璇utex涓哄尶鍚嶅璞°?br>濡傛灉璋冪敤鎴愬姛錛屽垯榪斿洖Mutex鐨勫彞鏌勶紝鍚﹀垯榪斿洖NULL錛屽鏋渓pName涓嶄負NULL涓旇皟鐢ㄥ墠鍚屽悕鐨凪utex宸茶鍒涘緩錛屽垯榪斿洖鍚屽悕Mutex鐨勫彞鏌勶紝姝ゆ椂璋冪敤GetLastError灝嗚繑鍥濫RROR_ALREADY_EXISTS錛屽弬鏁癰InitialOwner灝嗚蹇界暐銆?
榪樺彲浠ヨ皟鐢∣penMutex鎵撳紑鍒涘緩鐨勯潪鍖垮悕Mutex錛屽師鍨嬪涓?
HANDLE OpenMutex(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName
);
鍦ㄦ垚鍔熷垱寤烘垨鎵撳紑Mutex鍚庯紝鍙互浣跨敤wait functions鏉ョ瓑寰呭茍鑾峰彇Mutex鐨勬寔鏈夋潈銆?
涓嬮潰鐨勪緥瀛愮敤鏉ラ氳繃Mutex瀵硅薄鎺у埗鏌愪竴搴旂敤紼嬪簭鍙繍琛屼竴嬈?
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HANDLE hMutex = CreateMutex(NULL, FALSE, "Mutex_Only_One_Instance_Allowed");
if (NULL == hMutex)
{
Error("Create mutex error.");
return -1;
}
DWORD dw = WaitForSingleObject(hMutex, 0);
if (WAIT_FAILED == dw)
{
Error("Wait for mutex error.");
CloseHandle(hMutex); // 閲婃斁鍙ユ焺錛屽綋鎸囧悜鍚屼竴緋葷粺瀵硅薄鐨勬墍鏈夊彞鏌勯噴鏀懼悗錛岃瀵硅薄灝嗚鍒犻櫎銆?br> return -1;
}
else if (WAIT_TIMEOUT == dw)
{
// 鍙﹀涓涓疄渚嬫鍦ㄨ繍琛?br> CloseHandle(hMutex);
return 1;
}
// 娌℃湁鍏跺畠瀹炰緥鍦ㄨ繍琛岋紝鏈疄渚嬪皢緇х畫榪愯
// 鍦ㄦ瀹炵幇蹇呰鐨勫姛鑳芥т唬鐮侊紝濡傚垱寤虹獥鍙o紝榪涘叆娑堟伅寰幆
// ...............
ReleaseMutex(hMutex); // 閲婃斁hMutex鐨勬寔鏈夋潈錛屾敞鎰忚繖騫朵笉絳夊悓浜庡垹闄utex瀵硅薄
CloseHandle(hMutex);
return 0;
}
鍏朵腑WaitForSingleObject鏄瓑寰呯壒瀹氬璞″彂鍑轟俊鍙鳳紙signaled錛夛紝鑰孧utex瀵硅薄鍦ㄦ病鏈変換浣曠嚎紼嬫寔鏈夋椂浼氬彂鍑轟俊鍙楓?/p>