Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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# 流程已使用“启动”;CreateProcessAsUser";行为不同于交互式启动的进程_C#_Winapi - Fatal编程技术网

C# 流程已使用“启动”;CreateProcessAsUser";行为不同于交互式启动的进程

C# 流程已使用“启动”;CreateProcessAsUser";行为不同于交互式启动的进程,c#,winapi,C#,Winapi,通过CreateProcessAsUser api启动时,启动的应用程序中的嵌入式webbrowser控件在右键单击并在浏览器控件中的某些链接上选择“将目标另存为”时抛出错误“文件无法写入缓存” CreateProcessAsUser调用是作为OnStart()函数的一部分从服务中进行的。它通过枚举所有会话并检查“WTS_CONNECTSTATE_CLASS.WTSActive”的状态来检索当前用户会话的句柄 通过双击启动完全相同的可执行文件,我可以毫无问题地下载文件 我已通过任务管理器详细信息

通过CreateProcessAsUser api启动时,启动的应用程序中的嵌入式webbrowser控件在右键单击并在浏览器控件中的某些链接上选择“将目标另存为”时抛出错误“文件无法写入缓存”

CreateProcessAsUser调用是作为OnStart()函数的一部分从服务中进行的。它通过枚举所有会话并检查“WTS_CONNECTSTATE_CLASS.WTSActive”的状态来检索当前用户会话的句柄

通过双击启动完全相同的可执行文件,我可以毫无问题地下载文件

我已通过任务管理器详细信息以及System.Security.Principal.WindowsIdentity.GetCurrent().Name验证启动的进程是否在同一用户帐户下运行

我已尝试使用交互式登录帐户运行该服务;这样做会阻止服务使用CreateProcessAsUser函数启动任何可执行文件。使用System.Diagnostics.Process.Start()启动的进程位于会话0上,对交互式桌面隐藏,无法访问任何网络资源

我还尝试使用System.Diagnostics.Process,通过StartInfo传递用户凭据,但调用Start()时,我会遇到“访问被拒绝”的情况

if(wtsenumeratessions)(
(IntPtr)WTS_CURRENT_SERVER_HANDLE,//当前RD会话主机服务器句柄将为零。
0,//此保留参数必须为零。
1,//枚举请求的版本必须为1。
ref ppSessionInfo,//这将指向会话信息数组。
ref SessionCount//这将指示上述数组的长度。
))
{
对于(int-nCount=0;nCount

我希望使用上述代码启动的程序的行为与从桌面会话以交互方式启动的程序的行为相同,并且除了webbrowser控件和urlmon行为之外,它似乎是相同的。

根据RbMm的建议,我修改了调用以包括环境指针lpDesktop specificationn和CREATE_UNICODE_环境标志

STARTUPINFO tStartUpInfo=newstartupinfo();
tStartUpInfo.lpDesktop=“winsta0\\default”;
tStartUpInfo.cb=Marshal.SizeOf(typeof(STARTUPINFO));
IntPtr环境=IntPtr.0;
如果(!CreateEnvironmentBlock(out-environment,hToken,true))
{
环境=IntPtr.Zero;
抛出新异常(“无环境”);
}
bool ChildProcStarted=CreateProcessAsUser(
hToken,//已登录用户的令牌。
ChildProcName,//要启动的进程的名称。
Args,//要传递的任何命令行参数。
IntPtr.Zero,//默认进程的属性。
IntPtr.Zero,//默认线程的属性。
false,//不继承父级的句柄。
0x00000400,//创建\u UNICODE\u环境创建标志。
环境,//默认环境路径。
workingDirectory,//默认电流