欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁(yè) > 知識(shí)庫(kù) > asp.net中穿透Session 0 隔離(二)

asp.net中穿透Session 0 隔離(二)

熱門標(biāo)簽:使用智能電話機(jī)器人違法嗎 朝陽(yáng)市地圖標(biāo)注 蘇州銷售外呼系統(tǒng)預(yù)算 保山電話外呼管理系統(tǒng)怎么用 外呼系統(tǒng)用員工身份證 東莞語(yǔ)音電銷機(jī)器人排名 電話機(jī)器人廣告話術(shù) 太原外呼電銷機(jī)器人費(fèi)用 淘寶地圖標(biāo)注如何做
對(duì)于簡(jiǎn)單的交互,服務(wù)可以通過(guò)WTSSendMessage 函數(shù),在用戶Session 上顯示消息窗口。對(duì)于一些復(fù)雜的UI 交互,必須調(diào)用CreateProcessAsUser 或其他方法(WCF、.NET遠(yuǎn)程處理等)進(jìn)行跨Session 通信,在桌面用戶上創(chuàng)建一個(gè)應(yīng)用程序界面。

WTSSendMessage 函數(shù)
如果服務(wù)只是簡(jiǎn)單的向桌面用戶Session 發(fā)送消息窗口,則可以使用WTSSendMessage 函數(shù)實(shí)現(xiàn)。首先,在上一篇下載的代碼中加入一個(gè)Interop.cs 類,并在類中加入如下代碼:

復(fù)制代碼 代碼如下:

public static IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero;

public static void ShowMessageBox(string message, string title)
{
int resp = 0;
WTSSendMessage(
WTS_CURRENT_SERVER_HANDLE,
WTSGetActiveConsoleSessionId(),
title, title.Length,
message, message.Length,
0, 0, out resp, false);
}

[DllImport("kernel32.dll", SetLastError = true)]
public static extern int WTSGetActiveConsoleSessionId();

[DllImport("wtsapi32.dll", SetLastError = true)]
public static extern bool WTSSendMessage(
IntPtr hServer,
int SessionId,
String pTitle,
int TitleLength,
String pMessage,
int MessageLength,
int Style,
int Timeout,
out int pResponse,
bool bWait);

在ShowMessageBox 函數(shù)中調(diào)用了WTSSendMessage 來(lái)發(fā)送信息窗口,這樣我們就可以在Service 的OnStart 函數(shù)中使用,打開(kāi)Service1.cs 加入下面代碼:
復(fù)制代碼 代碼如下:

protected override void OnStart(string[] args)
{
Interop.ShowMessageBox("This a message from AlertService.", "AlertService Message");
}

編譯程序后在服務(wù)管理器中重新啟動(dòng)AlertService 服務(wù),從下圖中可以看到消息窗口是在當(dāng)前用戶桌面顯示的,而不是Session 0 中。

CreateProcessAsUser 函數(shù)

     如果想通過(guò)服務(wù)向桌面用戶Session 創(chuàng)建一個(gè)復(fù)雜UI 程序界面,則需要使用CreateProcessAsUser 函數(shù)為用戶創(chuàng)建一個(gè)新進(jìn)程用來(lái)運(yùn)行相應(yīng)的程序。打開(kāi)Interop 類繼續(xù)添加下面代碼:

復(fù)制代碼 代碼如下:

public static void CreateProcess(string app, string path)
{
bool result;
IntPtr hToken = WindowsIdentity.GetCurrent().Token;
IntPtr hDupedToken = IntPtr.Zero;

PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
sa.Length = Marshal.SizeOf(sa);

STARTUPINFO si = new STARTUPINFO();
si.cb = Marshal.SizeOf(si);

int dwSessionID = WTSGetActiveConsoleSessionId();
result = WTSQueryUserToken(dwSessionID, out hToken);

if (!result)
{
ShowMessageBox("WTSQueryUserToken failed", "AlertService Message");
}

result = DuplicateTokenEx(
hToken,
GENERIC_ALL_ACCESS,
ref sa,
(int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification,
(int)TOKEN_TYPE.TokenPrimary,
ref hDupedToken
);

if (!result)
{
ShowMessageBox("DuplicateTokenEx failed" ,"AlertService Message");
}

IntPtr lpEnvironment = IntPtr.Zero;
result = CreateEnvironmentBlock(out lpEnvironment, hDupedToken, false);

if (!result)
{
ShowMessageBox("CreateEnvironmentBlock failed", "AlertService Message");
}

result = CreateProcessAsUser(
hDupedToken,
app,
String.Empty,
ref sa, ref sa,
false, 0, IntPtr.Zero,
path, ref si, ref pi);

if (!result)
{
int error = Marshal.GetLastWin32Error();
string message = String.Format("CreateProcessAsUser Error: {0}", error);
ShowMessageBox(message, "AlertService Message");
}

if (pi.hProcess != IntPtr.Zero)
CloseHandle(pi.hProcess);
if (pi.hThread != IntPtr.Zero)
CloseHandle(pi.hThread);
if (hDupedToken != IntPtr.Zero)
CloseHandle(hDupedToken);
}

[StructLayout(LayoutKind.Sequential)]
public struct STARTUPINFO
{
public Int32 cb;
public string lpReserved;
public string lpDesktop;
public string lpTitle;
public Int32 dwX;
public Int32 dwY;
public Int32 dwXSize;
public Int32 dwXCountChars;
public Int32 dwYCountChars;
public Int32 dwFillAttribute;
public Int32 dwFlags;
public Int16 wShowWindow;
public Int16 cbReserved2;
public IntPtr lpReserved2;
public IntPtr hStdInput;
public IntPtr hStdOutput;
public IntPtr hStdError;
}

[StructLayout(LayoutKind.Sequential)]
public struct PROCESS_INFORMATION
{
public IntPtr hProcess;
public IntPtr hThread;
public Int32 dwProcessID;
public Int32 dwThreadID;
}

[StructLayout(LayoutKind.Sequential)]
public struct SECURITY_ATTRIBUTES
{
public Int32 Length;
public IntPtr lpSecurityDescriptor;
public bool bInheritHandle;
}

public enum SECURITY_IMPERSONATION_LEVEL
{
SecurityAnonymous,
SecurityIdentification,
SecurityImpersonation,
SecurityDelegation
}

public enum TOKEN_TYPE
{
TokenPrimary = 1,
TokenImpersonation
}

public const int GENERIC_ALL_ACCESS = 0x10000000;

[DllImport("kernel32.dll", SetLastError = true,
CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool CloseHandle(IntPtr handle);

[DllImport("advapi32.dll", SetLastError = true,
CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool CreateProcessAsUser(
IntPtr hToken,
string lpApplicationName,
string lpCommandLine,
ref SECURITY_ATTRIBUTES lpProcessAttributes,
ref SECURITY_ATTRIBUTES lpThreadAttributes,
bool bInheritHandle,
Int32 dwCreationFlags,
IntPtr lpEnvrionment,
string lpCurrentDirectory,
ref STARTUPINFO lpStartupInfo,
ref PROCESS_INFORMATION lpProcessInformation);

[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool DuplicateTokenEx(
IntPtr hExistingToken,
Int32 dwDesiredAccess,
ref SECURITY_ATTRIBUTES lpThreadAttributes,
Int32 ImpersonationLevel,
Int32 dwTokenType,
ref IntPtr phNewToken);

[DllImport("wtsapi32.dll", SetLastError=true)]
public static extern bool WTSQueryUserToken(
Int32 sessionId,
out IntPtr Token);

[DllImport("userenv.dll", SetLastError = true)]
static extern bool CreateEnvironmentBlock(
out IntPtr lpEnvironment,
IntPtr hToken,
bool bInherit);

在CreateProcess 函數(shù)中同時(shí)也涉及到DuplicateTokenEx、WTSQueryUserToken、CreateEnvironmentBlock 函數(shù)的使用,有興趣的朋友可通過(guò)MSDN 進(jìn)行學(xué)習(xí)。完成CreateProcess 函數(shù)創(chuàng)建后,就可以真正的通過(guò)它來(lái)調(diào)用應(yīng)用程序了,回到Service1.cs 修改一下OnStart 我們來(lái)打開(kāi)一個(gè)CMD 窗口。如下代碼:
復(fù)制代碼 代碼如下:

protected override void OnStart(string[] args)
{
Interop.CreateProcess("cmd.exe",@"C:\Windows\System32\");
}

重新編譯程序,啟動(dòng)AlertService 服務(wù)便可看到下圖界面。至此,我們已經(jīng)可以通過(guò)一些簡(jiǎn)單的方法對(duì)Session 0 隔離問(wèn)題進(jìn)行解決。大家也可以通過(guò)WCF 等技術(shù)完成一些更復(fù)雜的跨Session 通信方式,實(shí)現(xiàn)在Windows 7 及Vista 系統(tǒng)中服務(wù)與桌面用戶的交互操作。

參考資料

1. WTSSendMessage Function
http://msdn.microsoft.com/en-us/library/aa383842(VS.85).aspx

2. CreateProcessAsUser Function
http://msdn.microsoft.com/en-us/library/ms682429(v=VS.85).aspx

3. WTSSendMessage (wtsapi32)
http://www.pinvoke.net/default.aspx/wtsapi32/WTSSendMessage.html

4. WTSQueryUserToken Function
http://msdn.microsoft.com/en-us/library/aa383840(VS.85).aspx

5. http://www.pinvoke.net/

代碼下載 AlertService2_jb51.rar

作者:李敬然(Gnie)
出處:{GnieTech} (http://www.cnblogs.com/gnielee/)

您可能感興趣的文章:
  • asp.net中穿透Session 0 隔離(一)

標(biāo)簽:運(yùn)城 洛陽(yáng) 綏化 潛江 阿里 西藏 克拉瑪依 呼倫貝爾

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《asp.net中穿透Session 0 隔離(二)》,本文關(guān)鍵詞  asp.net,中,穿透,Session,隔離,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《asp.net中穿透Session 0 隔離(二)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于asp.net中穿透Session 0 隔離(二)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    男女男精品网站| 欧美乱大交做爰xxxⅹ小说| 91福利在线免费观看| 国产精品国产馆在线真实露脸 | 自拍偷拍国产亚洲| 国产激情视频一区二区三区欧美| 中国女人特级毛片| 精品乱人伦小说| 久久99精品国产.久久久久久 | 亚洲中文字幕一区| 91精品免费在线观看| 婷婷中文字幕综合| 久久久久久久无码| 欧美va亚洲va国产综合| 裸体在线国模精品偷拍| 美女脱光内衣内裤| 久久婷婷久久一区二区三区| 精品在线你懂的| 中文字幕第69页| 国产精品女人毛片| www.日本不卡| 欧美天堂亚洲电影院在线播放| 一区二区三区在线免费视频| www.四虎精品| 欧美一区二区三区小说| 蜜臀av一区二区在线观看| 级毛片内射视频| 欧美激情综合五月色丁香小说| 国产成人综合网站| 色呦呦日韩精品| 亚洲高清视频在线| aa片在线观看视频在线播放| 久久亚洲欧美国产精品乐播| 国产成人8x视频一区二区| 色婷婷久久久久swag精品| 亚洲一区在线观看免费观看电影高清| 国产十八熟妇av成人一区| 精品日产卡一卡二卡麻豆| 国产福利91精品一区二区三区| 黑鬼狂亚洲人videos| 亚洲愉拍自拍另类高清精品| 欧美一区二区三区成人精品| 久久久久久久久久久久电影| 成人国产在线观看| 欧美疯狂做受xxxx富婆| 美脚の诱脚舐め脚责91| 国产午夜精品理论片在线| 亚洲美女精品一区| 韩国无码一区二区三区精品| 国产精品午夜久久| 一级黄色免费视频| 久久久精品人体av艺术| 99国产精品免费视频| 欧美变态凌虐bdsm| av电影在线观看一区| 欧美一级视频精品观看| 国产91精品精华液一区二区三区 | 国产精品亚洲а∨天堂免在线| 91成人国产精品| 琪琪久久久久日韩精品| 成人在线观看高清| 天天影视色香欲综合网老头| 91社区视频在线观看| 亚洲精品亚洲人成人网在线播放| 亚洲天堂网一区二区| 国产精品乱人伦中文| 欧美精品黑人猛交高潮| 综合av第一页| 懂色av蜜桃av| 亚洲最色的网站| 1024在线看片| 天堂精品中文字幕在线| 色综合久久综合| 久久国产精品免费| 欧美揉bbbbb揉bbbbb| 国产成人在线网站| 欧美电影影音先锋| 成人黄色片在线观看| 精品黑人一区二区三区久久 | 中文子幕无线码一区tr| 国产高潮视频在线观看| 国产精品国产成人国产三级| 丰满圆润老女人hd| 亚洲一线二线三线久久久| 99久久99久久精品国产| 美洲天堂一区二卡三卡四卡视频| 日本道精品一区二区三区| 国内外成人在线| 欧美一级黄色片| 亚洲AV无码久久精品国产一区| 国产日产欧美一区二区三区| 日本黄色片在线播放| 亚洲精品视频自拍| 日本精品人妻无码77777| 久88久久88久久久| 日韩欧美激情四射| 理论片大全免费理伦片| 亚洲理论在线观看| 日本午夜精品视频| 久久精品国产亚洲5555| 56国语精品自产拍在线观看| 男男受被啪到高潮自述| 国产精品久久久久国产精品日日| 五月天精品视频| 青青草91视频| 日韩色视频在线观看| 99热超碰在线| 亚洲电影激情视频网站| 欧美中文字幕不卡| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 成人18精品视频| 国产精品丝袜久久久久久app| 免费黄色片网站| 久久av老司机精品网站导航| 日韩欧美一区电影| 亚洲精品乱码久久久久久久| 日韩中文字幕一区二区三区| 欧美肥妇free| 亚洲麻豆一区二区三区| 亚洲午夜激情av| 欧美日韩一级黄| av免费观看不卡| 五月婷婷久久综合| 91麻豆精品国产91| 99免费观看视频| 天堂精品中文字幕在线| 欧美一级在线免费| 亚洲一区二区三区蜜桃| 麻豆国产精品视频| 久久久久九九视频| 手机免费观看av| 国产99精品在线观看| 国产精品伦一区二区三级视频| caoporn91| 91小视频在线免费看| 亚洲在线中文字幕| 3751色影院一区二区三区| 波多野结衣视频播放| 蜜桃一区二区三区在线观看| 久久综合网色—综合色88| 永久免费毛片在线观看| 国产高清在线观看免费不卡| 国产精品久久久久毛片软件| 久久久久久久久毛片| 91色porny在线视频| 亚洲高清视频在线| 日韩免费观看高清完整版| 天天操天天舔天天射| 国产成人精品免费一区二区| 亚洲欧美一区二区三区极速播放 | 日韩精品在线网站| 欧美熟妇激情一区二区三区| 国产一区视频导航| 中文字幕中文字幕一区二区| 欧美系列一区二区| 亚洲国产欧美视频| 国产一区二区三区不卡在线观看| 国产精品三级av在线播放| 欧美中文字幕久久| 国产精品jizz| 国产成人啪免费观看软件| 亚洲乱码一区二区三区在线观看| 欧美丰满少妇xxxxx高潮对白| 国产成人av一区二区三区不卡| 国产高清不卡一区二区| 一区二区欧美国产| 欧美mv日韩mv| 私库av在线播放| 波多野结衣加勒比| 国产乱码字幕精品高清av| 一级精品视频在线观看宜春院| 欧美一二区视频| 亚洲 欧美 变态 另类 综合| 极品白嫩少妇无套内谢| 久久99精品国产91久久来源| 亚洲欧美日韩在线播放| 日韩欧美一区电影| 色噜噜夜夜夜综合网| 日本xxxx裸体xxxx| 成人av在线一区二区| 日韩电影在线免费| 国产精品黄色在线观看| 欧美日韩美少妇| 亚洲a∨无码无在线观看| 佐山爱在线视频| 精品一区二区免费在线观看| 亚洲另类中文字| 久久精品亚洲精品国产欧美kt∨ | 色8久久人人97超碰香蕉987| 国产三级视频网站| 91碰在线视频| 国产一区二区三区最好精华液| 亚洲精品成人在线| 久久―日本道色综合久久| 欧美日韩电影在线| 秋霞欧美一区二区三区视频免费| 精品无码人妻少妇久久久久久| 国产99久久久国产精品潘金 | 日韩精品91亚洲二区在线观看| 国产精品不卡一区|