我正在尝试远程执行Powershell脚本,该脚本将通过MSAccess启动accdb文件。我能够使Powershell脚本成功执行,但是MSAccess无法启动,因为我知道我所拥有的test.accdb文件没有得到更新。为了能够启动MSAccess,我的代码中缺少什么?还是不可能?
我的代码在IIS的Windows 2012 R2环境中运行,并由对计算机具有管理特权的服务帐户执行。如果我运行以该服务帐户登录的代码,则可以正常工作而不会出现问题。如果我远程执行,则仅执行部分代码
我的.NET应用程序代码如下(在服务帐户下运行)。我已经更改了一些私人信息,但不会影响代码。
internal static HttpStatusCode ExecuteRemoteCommand()
{
WSManConnectionInfo connectioninfo = new WSManConnectionInfo();
connectioninfo.ComputerName = "testcomputer";
using (Runspace runspace = RunspaceFactory.CreateRunspace(connectioninfo))
{
runspace.Open();
using (PowerShell ps = PowerShell.Create())
{
ps.Runspace = runspace;
var re = ps.AddScript(@"\\testcomputer\test\StartTest.ps1");
var results = re.Invoke();
}
}
return HttpStatusCode.Created;
}
我的Powershell代码如下:
try {
$msAccess = "C:\Program Files (x86)\Microsoft Office\Office14\msaccess.exe"
$fileLocation = "C:\test\DBT.accdb"
Start-Process -FilePath $msAccess -ArgumentList $fileLocation -Verb RunAs -WindowStyle Hidden -WorkingDirectory "C:\test"
$today = Get-Date
"SUCCESS: " + $today > "c:\test\TestExecutionSuccess.txt"
}
Catch
{
$_.Exception.Message > "c:\test\TestExecutionError.txt"
}
在两种情况下(在本地运行脚本的地方和在远程执行脚本的地方),创建 TestExecutionSuccess.txt文件。
但是,只有在本地测试运行中才更新DBT.accdb文件。
答案 0 :(得分:0)
所以让我们谈谈问题
1:您可以在登录的用户帐户下运行代码,然后运行代码并打开Excel。
2:您可以在登录的服务帐户下运行代码,然后运行代码并打开Excel。
3:您可以输入代码,但是如果您未登录用户,则Excel不会加载。
为什么?
这是关于交互式标志的。登录用户后,便可以使用COM加载GUI。如果您尚未登录用户,则无法加载GUI。
答案 1 :(得分:0)
在ArcSet的指导下,我认为我能够找出问题所在。他的回答使我无法研究运行哪个版本的Powershell。原来C#代码正在运行Powershell x64而不是x86(32位)版本。 Office安装是32位的,因此为什么我不能运行MSAccess。
我不知道如何从C#代码运行x86版本的Powershell,但是我所做的是将MSAccess的启动放入批处理文件中,然后从我的powershell代码执行了批处理文件。不是超级干净,但它起作用。访问现在可以正常运行。
这是批处理文件代码:
Freezable does not exist in the namesape
和PowerShell脚本的新版本:
cd "C:\Program Files (x86)\Microsoft Office\Office14"
MSACCESS.EXE C:\test\DBT.accdb