我正在尝试从 VBScript 文件中执行 .NET (3.5) 命令行程序,该程序主要执行两件事:
当我显式运行应用程序时,一切正常。 访问 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 中执行程序吗?
该问题与证书相关。 控制台应用程序调用的 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"
一旦做出改变,一切就都好了。 感谢所有提供帮助的人。
这不是回复(我无法发表评论),只是一些随机的想法可能会有所帮助。不幸的是,我从未使用过 Citrix,只使用过常规 Windows 服务器。
将 10 分钟的 Sleep() 添加到 .NET 应用程序的第一行,然后运行 VBScript 文件和独立应用程序,运行 sysinternals 进程资源管理器,并比较 2 个进程。
相同的选项卡,“命令行”和“当前目录”。确保它们是相同的。
“环境”选项卡。确保它们是相同的。通常子进程会继承环境,但这种行为可以很容易地改变。
如果“运行我的脚本”是指其他任何内容,则需要进行以下检查,然后双击 .VBS 文件:
当您运行 WScript.Shell 时,它在本地系统帐户下运行,该帐户在计算机上拥有完全权限,但在 Active Directory 中没有权限。
采纳 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"
如果这有效,当然最好的做法是专门为此任务创建和使用服务帐户,并拒绝交互式登录该帐户。