VBScript:使用 WScript.Shell 执行访问 Active Directory 的命令行程序

问题描述 投票:0回答:4

我正在尝试从 VBScript 文件中执行 .NET (3.5) 命令行程序,该程序主要执行两件事:

  • 连接到与托管脚本的服务器位于同一域的 Active Directory,以检索属性值。 我使用第一个命令行参数(即用户名)搜索 AD。
  • 使用所述属性值和第二个命令行参数创建 DTO,然后在 WCF 服务调用中使用该参数。

当我显式运行应用程序时,一切正常。 访问 Active Directory、检索属性并使用正确的结果调用 WCF 服务(通过查看数据库进行验证)。

(编辑:抱歉,我忘记了实际问题是什么。)

当我运行脚本时,似乎无法在 .NET 代码(MyProgram 应用程序)中访问 Active Directory。

VBScript 代码:

Dim objResult

Set objShell = WScript.CreateObject("WScript.Shell")    
objResult = objShell.Run("MyProgram " & strUsername & " 0", 1, True) 

WScript.Shell 对象是否需要文件的特殊权限? 我已经检查过它们并且有执行权限。 通常,我传递给 .Run() 方法的第二个参数是 6,我希望它是 1 以进行调试。

还有其他方法可以在 VBScript 中执行程序吗?

vbscript active-directory wsh
4个回答
1
投票

该问题与证书相关。 控制台应用程序调用的 WCF 服务使用 X509 证书进行身份验证,该证书安装在托管并运行该脚本的服务器上。

在使用相同服务的其他服务器上,证书配置如下:

winhttpcertcfg.exe -g -c LOCAL_MACHINE\My -s "certificate-name" -a "NETWORK SERVICE"

因为它们在 IIS 上下文中运行。 但是,当脚本像在生产中一样运行时,它是在用户自己的上下文中运行的。 因此,脚本需要修改为以下内容:

winhttpcertcfg.exe -g -c LOCAL_MACHINE\My -s "certificate-name" -a "USERS"

一旦做出改变,一切就都好了。 感谢所有提供帮助的人。


1
投票

这不是回复(我无法发表评论),只是一些随机的想法可能会有所帮助。不幸的是,我从未使用过 Citrix,只使用过常规 Windows 服务器。

  1. 确保您不是 Windows 防火墙或任何其他选择性阻止进程的个人防火墙的受害者。

将 10 分钟的 Sleep() 添加到 .NET 应用程序的第一行,然后运行 VBScript 文件和独立应用程序,运行 sysinternals 进程资源管理器,并比较 2 个进程。

  1. 相同的选项卡,“命令行”和“当前目录”。确保它们是相同的。

  2. “环境”选项卡。确保它们是相同的。通常子进程会继承环境,但这种行为可以很容易地改变。

如果“运行我的脚本”是指其他任何内容,则需要进行以下检查,然后双击 .VBS 文件:

  1. 图像选项卡,“用户”。如果它们不同 - 这可能意味着用户无权访问网络(如本地系统),或用户令牌仅限于委派,因此只能访问本地资源(如 IIS NTLM 身份验证),或用户无权访问某些资源它想要的本地文件。

0
投票

当您运行 WScript.Shell 时,它在本地系统帐户下运行,该帐户在计算机上拥有完全权限,但在 Active Directory 中没有权限。

http://support.microsoft.com/kb/278319


0
投票

采纳 Shiraz 的想法并付诸实践......

在您的应用程序中,您是否明确定义了用于访问 AD 的域用户帐户和密码?

当您显式执行应用程序时,它可能本质上使用您的凭据(您当前登录的域帐户)来询问 AD。 但是,当从脚本调用应用程序时,我不确定应用程序是否在系统上下文中。

VBScript 示例如下:

  Dim objConnection As ADODB.Connection
    Set objConnection = CreateObject("ADODB.Connection")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Properties("User ID") = "MyDomain\MyAccount"
    objConnection.Properties("Password") = "MyPassword"
    objConnection.Open "Active Directory Provider"

如果这有效,当然最好的做法是专门为此任务创建和使用服务帐户,并拒绝交互式登录该帐户。

© www.soinside.com 2019 - 2024. All rights reserved.