Prev: Datagridview sort programattically in virtual mode
Next: Paste an attached file in Outlook from the Clipboard in Windows Fo
From: Kirk on 8 Feb 2006 14:20 The following C# web service works fine until you uncomment the lines setting UserName and Password. Then the process starts as the specified user, but hangs in a suspended state. In fact, any executable will exhibit this problem; it is not specific to whoami.exe. This is with .NET 2.0, of course (1.1 does not support running a process as a different user). This appears to be a bug. Can anyone comment? <%@ WebService Language="C#" Class="Kirk.ForkIt" %> using System; using System.IO; using System.Collections; using System.Security; using System.Web.Services; using System.Diagnostics; namespace Kirk { public class ForkIt { [WebMethod] public string Main() { Process p = new Process(); ProcessStartInfo pInfo = new ProcessStartInfo(@"c:\windows\system32\whoami.exe"); SecureString password = new SecureString(); // set value for password here. password.AppendChar('s'); password.AppendChar('e'); password.AppendChar('c'); password.AppendChar('r'); password.AppendChar('e'); password.AppendChar('t'); pInfo.UserName = "Administrator"; pInfo.Password = password; pInfo.CreateNoWindow = true; pInfo.UseShellExecute = false; pInfo.RedirectStandardOutput = true; p.StartInfo = pInfo; p.Start(); String output = p.StandardOutput.ReadToEnd(); p.WaitForExit(); return output; } } }
From: DKode on 8 Feb 2006 14:24 hmmm maybe try putting the domain/computer name in front of the username: pInfo.UserName = "MyComputer\Administrator"; not sure, i havent used this feature in 2.0 yet
From: Kirk on 8 Feb 2006 15:11 Thanks, but your suggestion doesn't help. There is a Domain member for the ProcessStartInfo class, but setting that to the computer name doesn't help. Anyway, the authentication is not an issue _in itself_ as I can see that the hung process is running as the specified user (Administrator in this case). I can get any domain account to run the process, it's just that the process hangs -- any process.
From: Willy Denoyette [MVP] on 8 Feb 2006 15:44 What OS are you running this on and Who's the callers identity, that is the identity of the asp.net process or the impersonating identity if impersonation is active? Willy. "Kirk" <kirk.martinez(a)gmail.com> wrote in message news:1139426415.828865.323770(a)g14g2000cwa.googlegroups.com... | The following C# web service works fine until you uncomment the lines | setting UserName and Password. Then the process starts as the | specified user, but hangs in a suspended state. In fact, any | executable will exhibit this problem; it is not specific to whoami.exe. | This is with .NET 2.0, of course (1.1 does not support running a | process as a different user). This appears to be a bug. Can anyone | comment? | | <%@ WebService Language="C#" Class="Kirk.ForkIt" %> | | using System; | using System.IO; | using System.Collections; | using System.Security; | using System.Web.Services; | using System.Diagnostics; | | namespace Kirk | { | public class ForkIt | { | | [WebMethod] | public string Main() | { | Process p = new Process(); | ProcessStartInfo pInfo = new | ProcessStartInfo(@"c:\windows\system32\whoami.exe"); | | SecureString password = new SecureString(); | // set value for password here. | password.AppendChar('s'); | password.AppendChar('e'); | password.AppendChar('c'); | password.AppendChar('r'); | password.AppendChar('e'); | password.AppendChar('t'); | | pInfo.UserName = "Administrator"; | pInfo.Password = password; | pInfo.CreateNoWindow = true; | pInfo.UseShellExecute = false; | pInfo.RedirectStandardOutput = true; | | p.StartInfo = pInfo; | p.Start(); | | String output = p.StandardOutput.ReadToEnd(); | p.WaitForExit(); | | return output; | } | } | } |
From: Kirk on 9 Feb 2006 02:54
OS is Windows 2003 Server. I run IE6 and invoke the Web Service via the Invoke button from the default generator for .asmx files. The asmx file is also local to the web server; everything is on the same machine. I have impersonate set to true in my C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config file, and I am logged in as a domain user (DOMAIN/SOFTINFO, same DOMAIN that the server is in) with Administrative priviledges. When I invoke the service, Environment.DomainName="SW-WEB" Environment.UserName="IUSR_SWDEVL2" (SW-WEB is the name of the machine, SWDEVL2 was the previous name of the machine). If I remove impersonation from my web.config, the service throws an exception...Access is Denied. Environment.DomainName="DOMAIN" Environment.UserName="SYSTEM". Not sure what SYSTEM really means, but I suppose it doesn't have permission to create processes. Anyway, that's why I enabled impersonation in the first place (plus it's how my old ASP stuff works and I like it for our intranet). I'm no expert, but my understanding is that impersonation will run my Web Service thread as the client user, however, when my process forks, it will run as the IIS user. I'm a bit confused, though, becuase I would expect UserName to be "SOFTINFO" for the case where I have impersonation turned on. Perhaps you can clarify this. The Web Service is inline, and running from an Application Pool with Identity set to Local System. I also set it to Network Service and witness the same behavior. If I set it to Local Service I get the following error when I Invoke the Web Service (this is not a problem for me, but it might be a clue, I don't know): System.InvalidOperationException: Unable to generate a temporary class (result=1). error CS2001: Source file 'C:\WINDOWS\TEMP\qa0vmnpy.0.cs' could not be found error CS2008: No inputs specified at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, CompilerParameters parameters, Evidence evidence) at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, CompilerParameters parameters, Assembly assembly, Hashtable assemblies) at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence) at System.Xml.Serialization.XmlSerializer.FromMappings(XmlMapping[] mappings, Evidence evidence) at System.Web.Services.Protocols.XmlReturn.GetInitializers(LogicalMethodInfo[] methodInfos) at System.Web.Services.Protocols.XmlReturnWriter.GetInitializers(LogicalMethodInfo[] methodInfos) at System.Web.Services.Protocols.MimeFormatter.GetInitializers(Type type, LogicalMethodInfo[] methodInfos) at System.Web.Services.Protocols.HttpServerType..ctor(Type type) at System.Web.Services.Protocols.HttpServerProtocol.Initialize() at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing) Thanks, Kirk |