.NET:如果作为服务启动,C# System.Diagnostics.Process 无法访问共享驱动器映像,但作为 normal.exe 可以正常启动

.NET: C# System.Diagnostics.Process fails to access Shared drive images if being launch as Service, but works correctly launched as a normal.exe

1-) 我创建了一个 Python .exe,其中包含以下代码:

 def main():
    args = parse_arguments()
    result = []
    paths = args.files
    regions = args.regions
    oddplate = args.oddplate
    result = []


    #print ("Input args ")
    #print (args)
    #print ("\n")
    if not args.sdk_url and not args.api_key:
        raise Exception('api-key is required')
    if len(paths) == 0:
        print('File {} does not exist.'.format(args.FILE))
        return
    elif args.blur_dir and not os.path.exists(args.blur_dir):
        print('{} does not exist'.format(args.blur_dir))
        return
    ....

    print(result)
    return result

2-) 然后,我从 .net 创建一个 c# 函数(我们称之为 ProcessFunc),其中包括此代码

 ProcessStartInfo myProcessStartInfo = new ProcessStartInfo();

    // make sure we can read the output from stdout and that window is not shown
    myProcessStartInfo.UseShellExecute = false;

    myProcessStartInfo.RedirectStandardOutput = true;
    myProcessStartInfo.CreateNoWindow = true;
    myProcessStartInfo.FileName = dir_app;

    // start python app with 9 arguments
    myProcessStartInfo.Arguments = " " + Iapi_key + " " + Isdk_url + " " + Iregions + " " + Iblur_amount + " " + Ioddplate + " " + Iblur_dir;

    Process myProcess = new Process();
    // assign start information to the process 
    myProcess.StartInfo = myProcessStartInfo;
    // start the process 
    myProcess.Start();

    // Read the standard output of the app we called.  
    // in order to avoid deadlock we will read output first 
    // and then wait for process terminate: 
    StreamReader myStreamReader = myProcess.StandardOutput;
    string myString = myStreamReader.ReadLine();

    /*if you need to read multiple lines, you might use: 
        string myString = myStreamReader.ReadToEnd() */

    // wait exit signal from the app we called and then close it. 
    myProcess.WaitForExit();
    myProcess.Close();

    // write the output we got from python app 
    //Console.WriteLine("Value received from script: " + myString);
    return myString;

3-) 我有 3 个驱动器,C、N(本地计算机)和 Z(网络共享驱动器)

编译 C# 代码(生成 .exe)后,我调用了 python 生成的 .exe 的两种方式:

  1. 在主程序中引入该代码后双击 c# .exe(我们称之为 MyCProgramMain

    static void Main()
    {
    ProcessFunc();
    }
    

这可以正常工作(Iblur_dir 接受参数路径)

  1. 生成服务:

       static void Main()
         {
          System.Threading.Thread.CurrentThread.CurrentCulture = new 
          System.Globalization.CultureInfo("es-ES");
         ServiceBase[] ServicesToRun;
         ServicesToRun = new ServiceBase[]
         {
             new MyService()
         };
         ServiceBase.Run(ServicesToRun);
          }
    

这将创建一个 Thead:

public MyService()
 {
            InitializeComponent();
            HEjecucion = new Thread(classEjecucion.ProcessFunc);
                HEjecucion.Start();

之后我将启动生成的服务。

这样做时,我会在我的日志中收到这条消息(例如):

Z:21-08-18不存在

这只会发生在 Z:\ 驱动器中的路径,N:\ 和 C:\ 将被接受。

因此,当通过聚焦生成的 c# .exe

的主程序调用 Python.exe 时

*os.path.exists(args.blur_dir)* 理解路径存在

但是如果我通过使用 C# 生成的服务调用相同的 Python.exe,它无法访问 args.blur_dir 路径

我试过:

  1. 在包含
  2. 的 c#project 中创建 app.manifest

(可能跟权限有关)

  1. 尝试使用 myProcessStartInfo 参数看看是否有什么可以使

我花了很多时间尝试与 C# Process() 参数相关的多项操作,但似乎无法使 Service 'reach' dir_blur路径。 ¿我还能尝试什么?

你们很好!问题是我在使用特定用户登录的远程桌面上工作。

服务自动安装为 'Local system',我所要做的就是转到服务,在我的服务“属性”中,并在 'login' 选项卡中引入我用于远程桌面访问的凭据。