Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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# 获取提升的excel进程_C#_Excel_Marshalling - Fatal编程技术网

C# 获取提升的excel进程

C# 获取提升的excel进程,c#,excel,marshalling,C#,Excel,Marshalling,几天前,为了使用一些需要管理员或当前用户权限的加载项,我必须使用ProcessStartInfo以当前用户权限运行Excel new Process{ StartInfo = new ProcessStartInfo{ Verb = "runas", FileName = @"path/to/app.exe", Arguments = "-officeexcel", Domain = domain,

几天前,为了使用一些需要管理员或当前用户权限的加载项,我必须使用ProcessStartInfo以当前用户权限运行Excel

 new Process{
     StartInfo = new ProcessStartInfo{
          Verb = "runas",
          FileName = @"path/to/app.exe",
          Arguments = "-officeexcel",
          Domain = domain,
          UserName = login,
          Password = pa ss,
          UseShellExecute = false,
     }
 }.Start();
因此,我不能再使用:

Marshal.GetActiveObject("Excel.Application")
获取excel实例。因此,我尝试对AccessibleObjectFromWindow()使用后期绑定:

它工作了,但是我得到的Excel应用程序没有属性,我不能调用任何方法! 我需要在升级Excel实例后运行一些宏


我做错了什么?

出于安全原因,无法与以提升模式从非提升模式启动的应用程序交互

在您的情况下,我认为实现您要求的唯一方法是首先提升您的应用程序(或另一个专用于此任务的小应用程序),然后,您提升的应用程序将依次运行excel并执行您需要的任务。Excel将以提升模式运行


这样的设计模式是以所需的最低权限运行应用程序。然后提升,在命令行中指定一个“令牌”(可以通过IPC/sockets连接到应用程序的任何令牌)。

我已经编辑了您的标题。请看,“,其中的共识是“不,他们不应该”。你为什么要首先对此进行反思?
int hwnd = (int)FindWindow("XLMAIN", null);

if (hwnd != 0)
{
      int hwndChild = 0;
      EnumChildCallback cb = new EnumChildCallback(EnumChildProc);
      EnumChildWindows(hwnd, cb, ref hwndChild);

      if (hwndChild != 0)
      {
          const uint OBJID_NATIVEOM = 0xFFFFFFF0;
          Guid IID_IDispatch = new Guid("{00020400-0000-0000-C000-000000000046}");
          ExcelWindow ptr;

          int hr = AccessibleObjectFromWindow(hwndChild, OBJID_NATIVEOM, IID_IDispatch.ToByteArray(), out ptr);

          if (hr >= 0)
          {
              using (UILanguageHelper fix = new UILanguageHelper())
              {
                  return (Excel.Application)ptr.GetType().InvokeMember("Application", BindingFlags.GetProperty, null, ptr, null);
              }
           }
      }
}

return null;