如何生成在 Microsoft ASP.NET 中页被模拟的用户的上下文中运行的进程

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 889251
简介
本分步指南介绍如何生成 Microsoft ASP.NET 中页中被模拟的用户的上下文中运行的进程。若要生成模拟的用户的上下文中运行的进程,不能使用System.Diagnostics.Process.Start方法。这是因为在 ASP.NET 上,线程级别的而不是在进程级别执行模拟。因此,ASP.NET 辅助进程的上下文中并不是在模拟环境下,将运行从 ASP.NET 生成的任何进程。

返回页首

方法说明

要变通解决此问题,您必须进行平台调用 (P/Invoke) 到以下 Win32 Api:
  • CreateProcessAsUser函数创建 processunder 中的一个参数指定安全令牌的身份。但是,调用CreateProcessAsUser函数需要一个主令牌。因此,必须将 impersonatedtoken 转换到一个主令牌。
  • DuplicateTokenEx函数将转换模拟令牌 toa 主令牌。调用CreateProcessAsUser函数使用此主令牌。
注意:工作CreateProcessAsUser函数的调用,必须将 followingsecurity 的用户权限分配给被模拟的用户:
  • 在运行 Microsoft Windows 2000 的计算机,替换进程级令牌用户权限和模拟的用户增加配额用户权限分配。
  • 在运行 Microsoft Windows Server 2003 或 Microsoft Windows XP 的计算机,将分配到被模拟的用户的替换进程级令牌用户权限。
返回页首

生成过程的步骤

Microsoft 提供的编程示例仅用于说明,没有任何明示或暗示的担保。这包括但不限于适销性或特定用途适用性的暗示担保。本文假定您熟悉所演示的编程语言和用于创建和调试过程的工具。Microsoft 的支持工程师可以帮助解释某个特定过程的功能,但是他们不会修改这些示例以提供额外的功能或构建过程以满足您的特定要求。 生成的模拟用户上下文中运行的进程,请执行以下步骤:
  1. 在 Microsoft Visual Studio.NET 2003年中创建一个新的视觉 C# ASP.NET Web 应用程序,并将其命名为 Q889251 的应用程序。
  2. 在代码视图中打开 WebForm1.aspx 文件。
  3. 在 WebForm1.aspx 文件中,使用块的代码中添加以下语句。
    using System.Runtime.InteropServices;using System.Security.Principal;
  4. 找到看起来类似于下面的代码行的代码的行。
    public class WebForm1 :  System.Web.UI.Page
  5. 在步骤 4 中标识的代码行之后, 添加以下代码。
    			[StructLayout(LayoutKind.Sequential)] public struct STARTUPINFO		{			public int cb;			public String lpReserved;			public String lpDesktop;			public String lpTitle;			public uint dwX;			public uint dwY;			public uint dwXSize;			public uint dwYSize;			public uint dwXCountChars;			public uint dwYCountChars;			public uint dwFillAttribute;			public uint dwFlags;			public short wShowWindow;			public short 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 uint   dwProcessId;			public uint   dwThreadId;		}		[StructLayout(LayoutKind.Sequential)] public struct SECURITY_ATTRIBUTES		{			public int    Length;			public IntPtr lpSecurityDescriptor;			public bool   bInheritHandle;		}		[DllImport("kernel32.dll", EntryPoint="CloseHandle", SetLastError=true, CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]		public extern static bool CloseHandle(IntPtr handle);		[DllImport("advapi32.dll", EntryPoint="CreateProcessAsUser", SetLastError=true, CharSet=CharSet.Ansi, CallingConvention=CallingConvention.StdCall)]		public extern static bool CreateProcessAsUser(IntPtr hToken, String lpApplicationName, String lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes, 			ref SECURITY_ATTRIBUTES lpThreadAttributes, bool bInheritHandle, int dwCreationFlags, IntPtr lpEnvironment,			String lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation);		[DllImport("advapi32.dll", EntryPoint="DuplicateTokenEx")]		public extern static bool DuplicateTokenEx(IntPtr ExistingTokenHandle, uint dwDesiredAccess, 			ref SECURITY_ATTRIBUTES lpThreadAttributes, int TokenType,			int ImpersonationLevel, ref IntPtr DuplicateTokenHandle);
  6. 在解决方案资源管理器,右键单击WebForm1.aspx,然后单击打开。在设计视图中打开 Web 窗体。
  7. 视图菜单上,单击HTML 源代码
  8. 下面的代码替换 HTML 源窗口中的所有现有代码。
    <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Q889251.WebForm1" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><HTML>	<HEAD>		<title>WebForm1</title>		<meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">		<meta name="CODE_LANGUAGE" Content="C#">		<meta name="vs_defaultClientScript" content="JavaScript">		<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">	</HEAD>	<body>		<form id="Form1" method="post" runat="server">			<P>&nbsp;</P>			<P>Enter Path of process to be run (with relevant parameters)				<asp:TextBox id="TextBox1" runat="server"></asp:TextBox></P>			<P>				<asp:Button id="Button1" runat="server" Text="CreateProcess"></asp:Button>			</P>			<P>				<asp:Label id="Label1" runat="server">Status:</asp:Label></P>			<P>				<asp:Label id="Label2" runat="server">Impersonated Identity:</asp:Label></P>		</form>	</body></HTML>
  9. 视图菜单上,单击设计
  10. 双击CreateProcessButton1_Click方法中插入代码,并且代码将显示在内容窗格中。
  11. 下面的代码替换现有的Button1_Click方法。
    		private void Button1_Click(object sender, System.EventArgs e)		{			IntPtr Token = new IntPtr(0);			IntPtr DupedToken = new IntPtr(0);			bool      ret;			Label2.Text+=WindowsIdentity.GetCurrent().Name.ToString();						SECURITY_ATTRIBUTES sa  = new SECURITY_ATTRIBUTES();			sa.bInheritHandle       = false;			sa.Length               = Marshal.SizeOf(sa);			sa.lpSecurityDescriptor = (IntPtr)0;						Token = WindowsIdentity.GetCurrent().Token;			const uint GENERIC_ALL = 0x10000000;			const int SecurityImpersonation = 2;			const int TokenType = 1;			ret = DuplicateTokenEx(Token, GENERIC_ALL, ref sa, SecurityImpersonation, TokenType, ref DupedToken);						if (ret == false)				Label1.Text +="DuplicateTokenEx failed with " + Marshal.GetLastWin32Error();							else				Label1.Text+= "DuplicateTokenEx SUCCESS";			STARTUPINFO si          = new STARTUPINFO();			si.cb                   = Marshal.SizeOf(si);			si.lpDesktop            = "";						string commandLinePath;			commandLinePath = TextBox1.Text;			PROCESS_INFORMATION pi  = new PROCESS_INFORMATION();			ret = CreateProcessAsUser(DupedToken,null,commandLinePath, ref sa, ref sa, false, 0, (IntPtr)0, "c:\\", ref si, out pi);						if (ret == false)				Label1.Text +="CreateProcessAsUser failed with " + Marshal.GetLastWin32Error();			else			{				Label1.Text +="CreateProcessAsUser SUCCESS.  The child PID is" + pi.dwProcessId;				CloseHandle(pi.hProcess);				CloseHandle(pi.hThread);			}			ret = CloseHandle(DupedToken);			if (ret == false)				Label1.Text+=Marshal.GetLastWin32Error();			else				Label1.Text+="CloseHandle SUCCESS";		}
  12. 单击生成菜单上的生成解决方案
  13. 调试菜单上,单击开始
  14. 在 WebForm1 页中,键入要启动的进程的路径。例如,键入 SystemDriver\Windows\Notepad.exe.
  15. 单击CreateProcess
返回页首
参考
有关详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
306158 如何在 ASP.NET 应用程序中实现模拟
321748 如何创建 ASP.NET 应用程序的本地 Web 服务器
842790 您尝试模拟用户从一个 ASP.NET Web 应用程序中的辅助线程,则会出现 System.Security.SecurityException 异常
返回页首

属性

文章 ID:889251 - 上次审阅时间:01/10/2016 04:53:00 - 修订版本: 5.0

Microsoft ASP.NET 1.1, Microsoft ASP.NET 1.0, Microsoft .NET Framework 2.0

  • kbhowtomaster kbinfo kbmt KB889251 KbMtzh
反馈