2

我正在尝试从一个 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 中执行程序吗?

4

4 回答 4

1

这不是回复(我不能发表评论),只是一些随机的想法可能会有所帮助。不幸的是,我从来没有处理过 citrix,只处理过常规的 Windows 服务器。

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

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

_1。相同的选项卡、“命令行”和“当前目录”。确保它们相同。

_2。“环境”选项卡。确保它们相同。通常子进程继承环境,但这种行为很容易改变。

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

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

于 2009-06-28T11:58:06.473 回答
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"

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

于 2009-08-18T18:42:17.227 回答
0

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

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

于 2009-06-26T18:47:40.063 回答
0

接受设拉子的想法并付诸实践……

在您的应用程序中,您是否明确定义了域用户帐户和密码来访问 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"

如果这可行,那么最佳实践当然是专门为此任务创建和使用服务帐户,并拒绝交互式登录该帐户。

于 2009-06-26T23:20:17.317 回答