【问题标题】:Executing Powershell Script Remotely - MSAccess not launching远程执行 Powershell 脚本 - MSAccess 未启动
【发布时间】:2019-06-04 06:29:14
【问题描述】:

我正在尝试远程执行一个 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 文件。

【问题讨论】:

  • C# 应用在什么用户下运行?是否在 IIS 下运行?
  • 是的,它在服务帐户下的 IIS 下运行。服务帐户 company\testremote 在 testcomputer 服务器上也具有管理员权限,并且是一个 Active Directory 帐户
  • 所以问题是因为它没有要加载的屏幕。在您的本地计算机上它可以工作,因为运行代码的用户是您自己,并且您已登录并具有交互权限。当您登录到服务用户时,该用户具有交互权限并加载 Excel。在未作为服务帐户登录的远程计算机上,它在服务用户下运行并且可以写入文件,但它没有交互权限,因此无法加载 GUI。

标签: c# powershell ms-access


【解决方案1】:

让我们谈谈问题

1:您可以在您登录的用户帐户下运行代码时运行代码并打开Excel。

2:在你登录的服务账号下运行代码时,可以运行代码并打开Excel。

3 : 你可以输入代码但是如果你没有登录用户,Excel 将不会加载。

为什么?

这是关于交互式标志的。当您登录到用户时,您可以使用 COM 加载 GUI。如果您未登录用户,则无法加载 GUI。

这里有更深入的解释 Microsoft Interactive User

【讨论】:

    【解决方案2】:

    在 ArcSet 的指导下,我想我能够找出问题所在。他的回答使我走上了调查正在运行哪个版本的 powershell 的道路。原来 C# 代码运行的是 Powershell x64 而不是 x86(32 位)版本。办公室安装是 32 位的,因此我无法运行 MSAccess。

    我不知道如何从 C# 代码运行 x86 版本的 Powershell,但我所做的是将 MSAccess 的启动放入批处理文件,然后从我的 powershell 代码执行批处理文件。不是超级干净,但它有效。 Access 现在运行正常。

    这是批处理文件代码:

    cd "C:\Program Files (x86)\Microsoft Office\Office14"
    MSACCESS.EXE C:\test\DBT.accdb
    

    以及新版本的 PowerShell 脚本:

    try {
    
        $msAccess = "C:\Program Files (x86)\Microsoft Office\Office14\msaccess.exe"
        $fileLocation =  "C:\test\executeTest.bat"  
        cmd.exe /c $fileLocation
        $today = Get-Date
        "SUCCESS: " + $today > "c:\test\TestExecutionSuccess.txt"
    
    }
    Catch
    {
        $_.Exception.Message > "c:\test\TestExecutionError.txt"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-12
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 2013-10-15
      相关资源
      最近更新 更多