婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > asp.net中穿透Session 0 隔離(二)

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

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

WTSSendMessage 函數
如果服務只是簡單的向桌面用戶Session 發送消息窗口,則可以使用WTSSendMessage 函數實現。首先,在上一篇下載的代碼中加入一個Interop.cs 類,并在類中加入如下代碼:

復制代碼 代碼如下:

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 函數中調用了WTSSendMessage 來發送信息窗口,這樣我們就可以在Service 的OnStart 函數中使用,打開Service1.cs 加入下面代碼:
復制代碼 代碼如下:

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

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

CreateProcessAsUser 函數

     如果想通過服務向桌面用戶Session 創建一個復雜UI 程序界面,則需要使用CreateProcessAsUser 函數為用戶創建一個新進程用來運行相應的程序。打開Interop 類繼續添加下面代碼:

復制代碼 代碼如下:

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 函數中同時也涉及到DuplicateTokenEx、WTSQueryUserToken、CreateEnvironmentBlock 函數的使用,有興趣的朋友可通過MSDN 進行學習。完成CreateProcess 函數創建后,就可以真正的通過它來調用應用程序了,回到Service1.cs 修改一下OnStart 我們來打開一個CMD 窗口。如下代碼:
復制代碼 代碼如下:

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

重新編譯程序,啟動AlertService 服務便可看到下圖界面。至此,我們已經可以通過一些簡單的方法對Session 0 隔離問題進行解決。大家也可以通過WCF 等技術完成一些更復雜的跨Session 通信方式,實現在Windows 7 及Vista 系統中服務與桌面用戶的交互操作。

參考資料

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 隔離(一)

標簽:運城 洛陽 綏化 潛江 阿里 西藏 克拉瑪依 呼倫貝爾

巨人網絡通訊聲明:本文標題《asp.net中穿透Session 0 隔離(二)》,本文關鍵詞  asp.net,中,穿透,Session,隔離,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《asp.net中穿透Session 0 隔離(二)》相關的同類信息!
  • 本頁收集關于asp.net中穿透Session 0 隔離(二)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    色婷婷久久久久swag精品 | 精品视频一区三区九区| 韩国精品一区二区| 欧美色窝79yyyycom| 国产精品久久久久久亚洲毛片 | 成人精品免费视频| 国产欧美一区二区三区在线看蜜臀| 一区二区三区在线观看动漫| 国产高清在线观看免费不卡| 久久久噜噜噜久噜久久综合| 蜜桃传媒麻豆第一区在线观看| 色天天综合色天天久久| 综合中文字幕亚洲| 欧美日韩在线直播| 性欧美疯狂xxxxbbbb| 色综合久久综合网欧美综合网 | 国产激情视频一区二区三区欧美 | 欧美激情综合五月色丁香小说| 国产不卡视频在线观看| 亚洲精品免费电影| 国产欧美日韩麻豆91| 国产精品网站在线| 国产一区美女在线| 国产欧美日韩亚州综合| 99综合影院在线| 丝瓜av网站精品一区二区 | 国产精品女同一区二区三区| 久久69国产一区二区蜜臀| 亚洲成av人影院在线观看网| 中文字幕不卡的av| 麻豆高清免费国产一区| 91香蕉视频污在线| 精品国产一区二区三区av性色| 久久久国产精华| 亚洲一区二区四区蜜桃| 国产一区久久久| 91精品欧美综合在线观看最新| 久久免费精品国产久精品久久久久| 欧美在线高清视频| 欧美欧美午夜aⅴ在线观看| 日韩一区二区在线免费观看| 99精品国产一区二区三区不卡| 久久精品国产网站| 欧美精品高清视频| 国产在线观看一区二区| 91国内精品野花午夜精品| 国产精品国产三级国产专播品爱网| 亚洲男同1069视频| 国产成人精品免费看| 精品久久国产97色综合| 蜜桃精品在线观看| 色狠狠一区二区三区香蕉| 亚洲色大成网站www久久九九| 国产精品一品二品| 久久久国产精品麻豆| 国产精品1区2区3区| 精品国产污网站| 国产自产v一区二区三区c| 欧美成人精品1314www| 久久国产精品99精品国产| 久久久国际精品| 成人av在线一区二区三区| 日韩美女啊v在线免费观看| 色婷婷久久99综合精品jk白丝| 欧美一区二区日韩一区二区| 91 com成人网| 亚洲精品久久久蜜桃| 岛国av在线一区| 自拍偷在线精品自拍偷无码专区| caoporen国产精品视频| 亚洲精品中文字幕在线观看| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 久久99久久99小草精品免视看| 高清beeg欧美| 中文字幕五月欧美| 色天天综合久久久久综合片| 午夜精品久久一牛影视| 精品免费一区二区三区| 国产一区二区毛片| 亚洲欧美日韩综合aⅴ视频| 欧美日韩一区二区在线视频| 欧美aaaaaa午夜精品| 欧美性极品少妇| 亚洲一区二区三区爽爽爽爽爽 | 日韩激情一二三区| 欧美久久久久久久久| 国产乱码精品一区二区三区忘忧草 | 久久伊人中文字幕| 色呦呦国产精品| 另类小说综合欧美亚洲| 国产精品视频看| 欧美二区乱c少妇| 成人永久免费视频| 日本三级亚洲精品| 中文字幕一区二区三区视频| 欧美一二三在线| 99视频国产精品| 国产一区视频导航| 天天综合天天做天天综合| 中文字幕一区二区三区精华液| 精彩视频一区二区三区| 夜夜嗨av一区二区三区网页| 国产色一区二区| 欧美一区二区三区男人的天堂| 天天操天天干天天综合网| 亚洲同性同志一二三专区| 91日韩一区二区三区| 亚洲另类一区二区| 一区二区视频在线| 国产福利一区二区三区在线视频| 欧美日韩精品高清| 欧美v国产在线一区二区三区| 欧美日韩一区二区三区不卡| 9久草视频在线视频精品| 国产精品一区二区x88av| 久久成人久久爱| 日精品一区二区| 亚洲成av人片一区二区| 亚洲色大成网站www久久九九| 国产日韩欧美在线一区| 国产亚洲成av人在线观看导航| 日韩美一区二区三区| 日韩一区二区三区三四区视频在线观看 | 91香蕉视频黄| av不卡一区二区三区| 一区二区三区日韩在线观看| 日韩精品一区二区三区三区免费| 91精品国产综合久久久久久| 欧美电影影音先锋| 欧美电影影音先锋| 精品国精品国产| 久久综合九色综合97婷婷女人| 日韩欧美不卡一区| 日韩精品专区在线| 久久久久久久电影| 国产精品久久毛片a| 亚洲男人的天堂在线观看| 一区二区不卡在线播放 | 国产精品综合一区二区| 国产麻豆视频一区二区| 国产成人丝袜美腿| 国产亚洲欧美日韩日本| 亚洲一区二区精品3399| 欧美亚洲国产一区二区三区| 在线观看欧美日本| 91精品在线免费观看| 欧美精品一区二区三区蜜桃| 久久婷婷色综合| 在线观看亚洲精品视频| 欧美色图12p| 精品国产不卡一区二区三区| 在线观看精品一区| av一区二区久久| 久久男人中文字幕资源站| 亚洲精品成a人| 久久99久国产精品黄毛片色诱| 国产suv精品一区二区6| 久久国产精品99久久久久久老狼 | 欧美日韩一级视频| 精品国产精品一区二区夜夜嗨| 国产精品午夜电影| 五月天激情综合网| 丁香六月综合激情| 91精品蜜臀在线一区尤物| 国产精品亲子乱子伦xxxx裸| 三级久久三级久久久| 国产精品12区| 国产精品亚洲综合一区在线观看| 成人午夜av电影| 欧美一区二区大片| 玉米视频成人免费看| 免费成人av在线| 欧美吻胸吃奶大尺度电影| 久久精品夜色噜噜亚洲aⅴ| 日韩黄色小视频| 99久久综合99久久综合网站| 成人免费视频caoporn| 国产麻豆9l精品三级站| 99综合电影在线视频| 久久久影视传媒| 精品无人区卡一卡二卡三乱码免费卡| 色综合久久久久网| 在线免费观看成人短视频| 91精品中文字幕一区二区三区| 亚洲三级免费观看| 国产精品婷婷午夜在线观看| 久久丁香综合五月国产三级网站| 国产一区二区看久久| 久久亚洲春色中文字幕久久久| 爽爽淫人综合网网站| 香蕉加勒比综合久久| 91蜜桃网址入口| 亚洲日韩欧美一区二区在线| 成人小视频免费观看| 中文字幕中文字幕一区| bt7086福利一区国产| 一区在线中文字幕| 91视视频在线观看入口直接观看www | 欧美男女性生活在线直播观看| 亚洲精品一二三区|