.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 的两种方式:
在主程序中引入该代码后双击 c# .exe(我们称之为 MyCProgramMain)
static void Main()
{
ProcessFunc();
}
这可以正常工作(Iblur_dir 接受参数路径)
生成服务:
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 路径
我试过:
- 在包含
的 c#project 中创建 app.manifest
(可能跟权限有关)
- 尝试使用 myProcessStartInfo 参数看看是否有什么可以使
我花了很多时间尝试与 C# Process() 参数相关的多项操作,但似乎无法使 Service 'reach' dir_blur路径。 ¿我还能尝试什么?
你们很好!问题是我在使用特定用户登录的远程桌面上工作。
服务自动安装为 'Local system',我所要做的就是转到服务,在我的服务“属性”中,并在 'login' 选项卡中引入我用于远程桌面访问的凭据。
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 的两种方式:
在主程序中引入该代码后双击 c# .exe(我们称之为 MyCProgramMain)
static void Main() { ProcessFunc(); }
这可以正常工作(Iblur_dir 接受参数路径)
生成服务:
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 路径
我试过:
- 在包含 的 c#project 中创建 app.manifest
(可能跟权限有关)
- 尝试使用 myProcessStartInfo 参数看看是否有什么可以使
我花了很多时间尝试与 C# Process() 参数相关的多项操作,但似乎无法使 Service 'reach' dir_blur路径。 ¿我还能尝试什么?
你们很好!问题是我在使用特定用户登录的远程桌面上工作。
服务自动安装为 'Local system',我所要做的就是转到服务,在我的服务“属性”中,并在 'login' 选项卡中引入我用于远程桌面访问的凭据。