ID do artigo: 889251 - Última revisão: quinta-feira, 2 de junho de 2005 - Revisão: 4.6

Como gerar um processo que é executado no contexto do usuário representado em páginas Microsoft ASP.NET

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Recolher tudo

INTRODUÇÃO

Este artigo passo a passo descreve como gerar um processo que é executado no contexto do usuário representado em páginas Microsoft ASP.NET. Para gerar um processo que é executado no contexto do usuário representado, você não pode usar o método System.Diagnostics.Process.Start . Isso ocorre porque no ASP.NET, representação é realizada no nível do segmento e não no nível do processo. Por isso, qualquer processo que você gerar do ASP.NET será executado no contexto do processo de trabalho do ASP.NET e não em contexto representado.

Descrição da técnica

Para contornar esse problema, você deve fazer plataforma chamar chamadas (P/Invoke) para as seguintes APIs Win32:
  • A função CreateProcessAsUser cria um processo sob a identidade do token de segurança que é especificado em um dos parâmetros. No entanto, a chamada para a função CreateProcessAsUser requer um token primário. Portanto, você deve converter o token representado em um token primário.
  • A função DuplicateTokenEx converte um token representado em um token primário. A chamada para a função CreateProcessAsUser usa esse token primário.
Observação Para a chamada para a função CreateProcessAsUser trabalhar, os seguintes direitos de usuário de segurança devem ser atribuídos ao usuário representado:
  • Em um computador que está executando o Microsoft Windows 2000, atribua o direito de usuário Substituir um token no nível de processo e o direito de usuário Aumentar cotas para o usuário representado.
  • Em um computador que esteja executando o Microsoft Windows Server 2003 ou Microsoft Windows XP, atribua o direito de usuário Substituir um token no nível de processo para o usuário representado.

Etapas para gerar um processo

Microsoft fornece exemplos de programação apenas para ilustração, sem garantia expressa ou implícita. Isso inclui, mas não está limitado a, garantias implícitas de comercialização ou adequação para uma finalidade específica. Este artigo presume que você está familiarizados com a linguagem de programação que está sendo demonstrada e com as ferramentas que são usadas para criar e depurar procedimentos. Engenheiros de suporte podem ajudar a explicar a funcionalidade de um determinado procedimento, mas eles não modificarão esses exemplos para fornecer funcionalidades adicionais ou construir procedimentos para atender às suas necessidades. Para gerar um processo que é executado no contexto do usuário representado, execute estas etapas:
  1. No Microsoft Visual Studio .NET 2003, crie um novo aplicativo ASP.NET de translation from VPE for Csharp Visual e, em seguida, nomeie o aplicativo Q889251.
  2. Abra o arquivo WebForm1.aspx no modo de exibição de código.
  3. No arquivo WebForm1.aspx, adicione as instruções a seguir para o bloco de código usando .
    using System.Runtime.InteropServices;
    using System.Security.Principal;
    
  4. Localize a linha de código parecido com a linha de código a seguir.
    public class WebForm1 :  System.Web.UI.Page
  5. Após a linha de código que é identificado na etapa 4, adicione o código a seguir.
    	
    		[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. No Solution Explorer, clique com o botão direito do mouse em WebForm1.aspx e, em seguida, clique em Abrir . Abre o formulário da Web no modo de design.
  7. No menu Exibir , clique em Código fonte HTML .
  8. Substitua todo o código existente na janela de código fonte HTML com o seguinte código.
    <%@ 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. No menu Exibir , clique em criar .
  10. Clique duas vezes em CreateProcess . O método Button1_Click é inserido no código e o código é exibida no painel de conteúdo.
  11. Substitua o método Button1_Click existente com o código a seguir.
    		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. No menu Build , clique em Build Solution .
  13. No menu Debug , clique em Iniciar .
  14. Na página WebForm1, digite o caminho de um processo que você deseja iniciar. Por exemplo, digite SystemDriver \Windows\Notepad.exe .
  15. Clique em CreateProcess .

Referências

Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
306158  (http://support.microsoft.com/kb/306158/ ) Como implementar a representação em um aplicativo ASP.NET
321748  (http://support.microsoft.com/kb/321748/ ) Como criar um servidor Web local aplicativo ASP.NET
842790  (http://support.microsoft.com/kb/842790/ ) Uma exceção System.Security.SecurityException ocorre quando você tenta representar um usuário de um thread secundário em um aplicativo ASP.NET

A informação contida neste artigo aplica-se a:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
  • Microsoft .NET Framework 2.0
Palavras-chave: 
kbmt kbhowtomaster kbinfo KB889251 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 889251  (http://support.microsoft.com/kb/889251/en-us/ )