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.
Este artigo passo a passo descreve como expandir um processo executado no contexto do utilizador representado em páginas Microsoft ASP.NET. Para expandir um processo executado no contexto do utilizador representado, pode utilizar o método System.Diagnostics.Process.Start . Isto acontece porque o ASP.NET, representação é efectuada ao nível do thread e não ao nível do processo. Assim, qualquer processo que geram do ASP.NET serão executados no contexto do processo de trabalho do ASP.NET e não no contexto do representado.
Para contornar este problema, tem de efectuar plataforma invocar chamadas (P/Invoke) para a seguinte API de Win32:
A função CreateProcessAsUser cria um processo sob a identidade do token de segurança é especificado em um dos parâmetros. No entanto, a chamada de função CreateProcessAsUser requer um token primário. Por conseguinte, terá de converter o token representado para um token primário.
A função DuplicateTokenEx converte um token representado um token primário. A chamada à função CreateProcessAsUser utiliza este token primário.
Nota Para a chamada à função CreateProcessAsUser trabalhar, segurança seguintes direitos de utilizador tem ser atribuídos ao utilizador representado:
Num computador que esteja a executar o Microsoft Windows 2000, atribua o direito de utilizador substituir um token de nível de processo e o direito de utilizador Aumentar quotas para o utilizador representado.
Num computador com o Microsoft Windows Server 2003 ou Microsoft Windows XP, atribua o direito de utilizador substituir um token de nível de processo para o utilizador representado.
A Microsoft fornece exemplos de programação apenas, para fins sem garantia expressa ou implícita. Isto inclui, mas não está limitado a, as garantias implícitas de comercialização ou adequação a um fim específico. Este artigo pressupõe que está familiarizado com a linguagem de programação apresentada e as ferramentas que são utilizadas para criar e depurar procedimentos. Os técnicos de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às necessidades específicas do utilizador. Para expandir um processo executado no contexto do utilizador representado, siga estes passos:
No Microsoft Visual Studio .NET 2003, criar uma nova aplicação Visual C# Web do ASP.NET e, em seguida, nome da aplicação Q889251.
Abra o ficheiro WebForm1.aspx na vista de código.
No ficheiro WebForm1.aspx, adicione as declarações seguintes ao bloco de código a utilizar .
using System.Runtime.InteropServices;
using System.Security.Principal;
Localize a linha de código semelhante à seguinte linha de código.
public class WebForm1 : System.Web.UI.Page
Depois da linha de código que é identificado no passo 4, adicione o seguinte código.
[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);
No Solution Explorer, clique com o botão direito do rato em WebForm1.aspx e, em seguida, clique em Abrir . O formulário Web abre na vista de estrutura.
No menu Ver , clique em Código HTML .
Substitua o seguinte código todo o código existente na janela de código 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> </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>
No menu Ver , clique em ' estrutura '.
Faça duplo clique em CreateProcess . O método Button1_Click é inserido o código e o código aparece no painel de conteúdo.
Substitua o seguinte código de método Button1_Click existente.
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";
}
No menu criar , clique em Criar soluções .
No menu Debug , clique em Iniciar .
Na página WebForm1, escreva o caminho de um processo que pretende iniciar. Por exemplo, escreva SystemDriver \Windows\Notepad.exe .
Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
306158
(http://support.microsoft.com/kb/306158/
)
Como implementar a representação numa aplicação do ASP.NET
321748
(http://support.microsoft.com/kb/321748/
)
Como criar um servidor Web local aplicação do ASP.NET
842790
(http://support.microsoft.com/kb/842790/
)
Uma excepção System.Security.SecurityException ocorre quando tenta representar um utilizador a partir de um thread secundário numa aplicação Web do ASP.NET
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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/
)
Qual foi o esforço que despendeu pessoalmente para utilizar este artigo?
Muito baixo
Baixo
Moderado
Elevado
Muito elevado
Diga-nos porquê e o que podemos fazer para melhorar estas informações
Obrigado! Os seus comentários são utilizados para ajudar-nos a melhorar o conteúdo do nosso suporte. Para obter mais opções de assistência, visite a Home Page de Ajuda e Suporte.