Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# asp.net下的Process.Start()?_C#_Asp.net_Iis_Iis 7.5_W3wp.exe - Fatal编程技术网

C# asp.net下的Process.Start()?

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

根据:

ASP.NET网页和服务器控制代码在的上下文中执行 Web服务器上的ASP.NET工作进程。如果你用启动键 方法在ASP.NET网页或服务器控件中创建新进程 使用受限权限在Web服务器上执行。这个 进程不会在与客户端浏览器相同的上下文中启动,并且 无法访问用户桌面

哪个账户是“受限权限”

例如:

  • 我以
    RoyiN
  • 已启用windows身份验证
  • 模拟作为
    BobK
    web.config(整个站点)启用
  • W3WP
    用户是
    UserA
    (不是网络或应用程序池标识)
在C#中,我执行
过程。开始(“…cmd.exe…”)
使用
Startinfo
凭据,如:“
Martin
”、“
密码
”、“
”)

  • 最后运行
    cmd.exe
    的高效
    帐户是谁

  • “受限权限”实际上是针对谁的


我相信MSDN条目指的是这样一个事实,即即使启用了模拟,并且您处于特定的用户上下文中,新进程也将由该进程生成,并且模拟发生在线程级别。也就是说,我相信它会在“UserA”上下文下运行

以下是相关的知识库条目:


请注意,相同的条目描述了如何使用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确实提供了凭据。好的,在这种情况下,新进程应该以与您在进程开始信息中指定的任何用户/域相同的身份启动。