C# asp.net下的Process.Start()?
根据: ASP.NET网页和服务器控制代码在的上下文中执行 Web服务器上的ASP.NET工作进程。如果你用启动键 方法在ASP.NET网页或服务器控件中创建新进程 使用受限权限在Web服务器上执行。这个 进程不会在与客户端浏览器相同的上下文中启动,并且 无法访问用户桌面 哪个账户是“受限权限” 例如:C# asp.net下的Process.Start()?,c#,asp.net,iis,iis-7.5,w3wp.exe,C#,Asp.net,Iis,Iis 7.5,W3wp.exe,根据: ASP.NET网页和服务器控制代码在的上下文中执行 Web服务器上的ASP.NET工作进程。如果你用启动键 方法在ASP.NET网页或服务器控件中创建新进程 使用受限权限在Web服务器上执行。这个 进程不会在与客户端浏览器相同的上下文中启动,并且 无法访问用户桌面 哪个账户是“受限权限” 例如: 我以RoyiN 已启用windows身份验证 模拟作为BobK在web.config(整个站点)启用 W3WP用户是UserA(不是网络或应用程序池标识) 在C#中,我执行过程。开始(“…c
- 我以
RoyiN
- 已启用windows身份验证
- 模拟作为
在web.config(整个站点)启用BobK
用户是W3WP
(不是网络或应用程序池标识)UserA
过程。开始(“…cmd.exe…”)
(使用Startinfo
凭据,如:“Martin
”、“密码
”、“域
”)
- 最后运行
的高效cmd.exe
帐户是谁
- “受限权限”实际上是针对谁的
请注意,相同的条目描述了如何使用CreateProcessAsUser来允许模拟。正如我在尝试解决问题时发现的,很多小事情都是不同的。它可能在RoyiN下运行,但您可能会发现USERPROFILE设置为C:\Windows\system32\config\systemprofile,而不是您的/Users/RoyiN文件夹
取决于你想做什么,这可能会导致一些问题。在我的例子中,启动git进程将永远挂起。不仅USERPROFILE和HOME错误,我还发现模拟用户不能很好地使用映射的网络驱动器。模拟在这里不会起作用,因为在后台,
进程。Start
依赖于两个本机Win32调用之一:
如果提供了ProcessStartInfo.UserName:
CreateProcessWithLogonW(startInfo.UserName, startInfo.Domain, ...)
若否:
CreateProcess(null, cmdLine, null, null, true, ...)
传递到CreateProcess中的null
s很可能会咬到您;从MSDN:
结构的lpSecurityDescriptor成员为主线程指定安全描述符。如果lpThreadAttributes为空
如果lpSecurityDescriptor为NULL,则线程将获得默认安全性
描述符。线程的默认安全描述符中的ACL
来自进程令牌
请注意,它表示来自进程令牌,而不是调用线程-模拟身份没有机会加入该方,因为它已绑定到线程。。默认情况下,生成的进程将作为运行应用程序池的任何身份启动。让进程作为另一个用户上下文启动的唯一方法是p/invoke。但正如@OnoSendai所说,模拟发生在线程级别,process.Start在win32调用CreateProcessWithLogonW或CreateProcess(取决于是否在ProcessStartInfo中设置了用户名)内部使用p/invoke进行分叉,我的代码中没有使用模拟,它是写在web.cofig中的。所以整个网站都在模拟中@RoyiNamir,谁编写了模拟代码并不重要——如果使用已经是ASP.Net一部分的代码或手动代码,行为将完全相同,因为最终将归结为相同的本机调用。Web.config无法更改工作进程运行时所使用的帐户-它只会触发运行请求的线程上的模拟。@AlexeiLevenkov,这样w3wp用户权限就不会有任何用途……对吗?因为所有线程都将由模拟用户执行。此处不涉及null。(当我通过
startinfo
使用凭据运行该过程时。忘记提及,非常抱歉。更新了问题。)希望聊天有所帮助-回答您的两个问题:“谁是实际运行cmd.exe的帐户?”=>UserA。“受限权限”实际上是针对谁的?”=>受限权限是指w3wp用户作为应用程序池标识的(通常)情况,其权限减少。在您的情况下,“UserA”@JerKimball请注意Startinfo确实提供了凭据。好的,在这种情况下,新进程应该以与您在进程开始信息中指定的任何用户/域相同的身份启动。