Makale numarası: 889251 - Son Gözden Geçirme: 02 Haziran 2005 Perşembe - Gözden geçirme: 4.6

Microsoft ASP.NET sayfalarında Kimliğine bürünülen kullanıcının bağlamında çalışan bir işlem spawn nasıl kullanılır

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Giriş

Bu adım adım makalede, Microsoft ASP.NET sayfalarında Kimliğine bürünülen kullanıcının bağlamında çalışan bir işlem spawn açıklamaktadır. Kimliğine bürünülen kullanıcı bağlamında çalışan bir işlem spawn System.Diagnostics.Process.Start yöntemi kullanamazsınız. ASP.NET'te, kimliğe bürünme düzeyinde iş parçacığı ve işlem düzeyinde gerçekleştirilir olmasıdır. Bu nedenle, ASP.NET'ten spawn herhangi bir işlem kimliğine bürünülen bağlamında değil ve ASP.NET alt işlemi bağlamında çalışır.

Tekniğin Açıklaması

Bu soruna geçici bir çözüm bulmak için <a0></a0>, aşağıdaki Win32 Apı çağrıları (P/ınvoke) çağırma platform yapmanız gerekir:
  • CreateProcessAsUser işlevi, belirtilen parametrelerden biri güvenlik belirteci kimliği altında bir işlem oluşturur. Ancak, birincil simge CreateProcessAsUser işlevi çağrısı gerektirir. Bu nedenle, Kimliğine bürünülen token için birincil bir belirteç dönüştürmeniz gerekir.
  • Kimliğine bürünülen bir belirteç, DuplicateTokenEx işlevi için birincil bir belirteç dönüştürür. CreateProcessAsUser işlevi çağrısı bu birincil belirteç kullanır.
Not Çalışmak arama için CreateProcessAsUser çalışması için aşağıdaki kullanıcı haklarını güvenlik kimliğine bürünülen kullanıcı için atanmış olması gerekir:
  • Microsoft Windows 2000 çalıştıran bir bilgisayarda, işlem düzeyi simgesini değiştir kullanıcı hakkı ve Kimliğine bürünülen kullanıcı için kotaları Artır kullanıcı hakkını atamak.
  • Microsoft Windows Server 2003 veya Microsoft Windows XP çalıştıran bir bilgisayarda, Kimliğine bürünülen kullanıcı için işlem düzeyi simgesini değiştir kullanıcı hakkını atayabilirsiniz.

Bir işlem spawn adımları

Microsoft, programlama örneklerini yalnızca gösterim amacıyla sağlar; örtülü veya açık garanti vermez. Buna satılabilirlik veya belirli bir amaca uygunluk zımni garantileri de dahildir, ancak bunlarla sınırlı değildir. Bu makale, gösterilen programlama dilini ve yordamları oluşturmak ve hata ayıklamak amacıyla kullanılan araçları kullanmayı bildiğinizi varsayar. Microsoft destek mühendisleri, belirli bir yordamın işlevselliğinin açıklanmasına yardımcı olabilir, ancak gereksinimlerinizi karşılamaya yönelik olarak ek işlevsellik sağlamak veya yordamlar geliştirmek amacıyla bu örnekleri değiştirmezler. Kimliğine bürünülen kullanıcı bağlamında çalışan bir işlem spawn için <a0></a0>, aşağıdaki adımları izleyin:
  1. Microsoft Visual Studio .NET 2003 ' te yeni bir Visual C# ASP.NET Web uygulaması oluşturmak ve sonra Q889251 uygulamanın adı.
  2. Kod görünümünde WebForm1.aspx dosyasını.
  3. WebForm1.aspx dosyasına aşağıdaki kodu kullanarak bloğu ekleyin.
    using System.Runtime.InteropServices;
    using System.Security.Principal;
    
  4. Aşağıdaki kod satırını benzer kod satırını bulun.
    public class WebForm1 :  System.Web.UI.Page
  5. Adım 4'te tanımlanan kod satırdan sonra aşağıdaki kodu ekleyin.
    	
    		[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. Solution Explorer'da (Çözüm Gezgini), WebForm1.aspx dosyasını sağ tıklatın ve sonra da ' ı tıklatın. Web formu Tasarım görünümünde açar.
  7. Görünüm menüsünden HTML kaynağı ' nı tıklatın.
  8. HTML kaynak penceresini, varolan tüm kodu aşağıdaki kodla değiştirin.
    <%@ 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. Görünüm menüsünde tasarımı tıklatın.
  10. CreateProcess</a1> çift tıklatın. Button1_Click yöntemi kod eklenir ve kod içerik bölmesinde görüntülenir.
  11. Varolan Button1_Click yöntemi aşağıdaki kodla değiştirin.
    		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. Yapı) menüsünde, Build Solution ' ı tıklatın.
  13. Hata Ayıkla) menüsünde, Başlat ' ı tıklatın.
  14. WebForm1 sayfasında, bir işlem başlatmak istediğiniz yolu yazın. Örneğin, SystemDriver \Windows\Notepad.exe yazın.
  15. CreateProcess Ek Yardım düğmesini tıklatın.

Referanslar

Daha fazla bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
306158  (http://support.microsoft.com/kb/306158/ ) ASP.NET uygulamasında kimliğe bürünme nasıl uygulanır (Bu bağlantı, bir kısmı veya tamamı İngilizce olan içeriğe işaret edebilir.)
321748  (http://support.microsoft.com/kb/321748/ ) Yerel bir Web sunucusu ASP.NET uygulamaları oluşturma hakkında
842790  (http://support.microsoft.com/kb/842790/ ) Bir ASP.NET Web uygulaması ikincil bir iş parçacığı bir kullanıcının kimliğine bürünmek çalıştığınızda System.Security.SecurityException bir özel durum oluşur.

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
  • Microsoft .NET Framework 2.0
Anahtar Kelimeler: 
kbmt kbhowtomaster kbinfo KB889251 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:889251  (http://support.microsoft.com/kb/889251/en-us/ )