【问题标题】:VBScript: Using WScript.Shell to Execute a Command Line Program That Accesses Active DirectoryVBScript:使用 WScript.Shell 执行访问 Active Directory 的命令行程序
【发布时间】:2009-06-26 17:34:41
【问题描述】:

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

【问题讨论】:

  • 非常明确地说明失败案例中会发生什么会很有帮助。
  • 抱歉,我太忙于其他细节,忘记了最重要的一个。在 MyProgram 应用中似乎没有访问 AD。

标签: vbscript active-directory wsh


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 感谢您的建议。我下载了 Process Explorer,发现通过 VBScript 运行程序时,命令行和当前目录是不同的。在这种情况下,后者是调用应用程序使用的网络上的某个映射驱动器。我不确定这是否意味着我需要从该目录运行我的应用程序,或者我是否需要重新考虑我的方法。
【解决方案2】:

这个问题原来与证书有关。控制台应用程序调用的 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"

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 脚本通过托管桌面应用程序执行(涉及 Citrix)。无论如何,据我所知,它不会在 IIS 的上下文中运行。
    【解决方案4】:

    采纳设拉子的想法并付诸实践……

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

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

    【讨论】:

    • 在我的 Active Directory 实用程序类中,我使用非特权帐户进行连接(无法更改密码,但可以搜索用户)。帐户名称及其加密密码存储在 app.config(或 MyProgram.exe.config,而不是)中。 DirectoryEntry entry = new DirectoryEntry("LDAP://MyLDAP", "Non-Privileged Account", Decrypt("EncryptedPassword"), AuthenticationType.Secure);这基本上就是我连接到 AD 的方式。然后,我使用带有过滤器的 DirectorySearcher 对象来搜索用户。 DirectorySearcher searcher = new DirectorySearcher(entry);
    • 在那种情况下,我很难过。您是否按照 Soonts 的建议(如下)进行操作并使用 Process Explorer 进行更深入的挖掘?
    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 2012-09-17
    • 2015-07-08
    • 1970-01-01
    • 2013-06-08
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多