VBScript: использование WScript.Shell для запуска программы командной строки, которая обращается к Active Directory - PullRequest
2 голосов
/ 26 июня 2009

Я пытаюсь запустить программу командной строки .NET (3.5) из файла VBScript, который выполняет две основные функции:

  • Подключается к Active Directory, который находится в том же домене, что и сервер, на котором размещен сценарий для получения значения атрибута. Я ищу AD, используя первый аргумент командной строки, который является именем пользователя.
  • Создает DTO, используя указанное значение атрибута и второй аргумент командной строки, которые затем используются в вызове службы WCF.

Когда я запускаю приложение явно, все работает. Доступ к Active Directory осуществляется, атрибут извлекается, и служба WCF вызывается с правильным результатом (что подтверждается просмотром базы данных).

(Изменить: я прошу прощения, я забыл поставить, что было на самом деле.)

Когда я запускаю сценарий, мне кажется, что я не могу получить доступ к Active Directory в своем коде .NET (приложение MyProgram).

Код VBScript:

Dim objResult

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

Нужны ли объекту WScript.Shell специальные разрешения для файла? Я проверил их, и разрешение на выполнение есть. Как правило, второй аргумент, который я передаю методу .Run (), будет 6, я хотел, чтобы он был 1 для отладки.

Есть ли другой способ выполнить программу на VBScript?

Ответы [ 4 ]

1 голос
/ 18 августа 2009

Проблема оказалась связана с сертификатом. Служба 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 голос
/ 28 июня 2009

Это не ответ (я не могу оставлять комментарии), только несколько случайных идей могут быть полезны. К сожалению, я никогда не имел дело с Citrix, только с обычными серверами Windows.

_0. Убедитесь, что вы не являетесь жертвой брандмауэра Windows или любого другого персонального брандмауэра, который выборочно блокирует процессы.

Добавьте 10 минут Sleep () к первой строке вашего приложения .NET, затем запустите и файл VBScript, и ваше автономное приложение, запустите проводник процессов sysinternals и сравните 2 процесса.

_1. Та же вкладка, «командная строка» и «текущий каталог». Убедитесь, что они одинаковы.

_2. Вкладка «Окружающая среда». Убедитесь, что они одинаковы. Обычно дочерние процессы наследуют среду, но это поведение может быть легко изменено.

Следующая проверка необходима, если под «запустить мой скрипт» вы подразумеваете что-то еще, а затем дважды щелкните файл .VBS:

_3. Вкладка Изображение «Пользователь». Если они различаются - это может означать, что пользователь не имеет доступа к сети (например, localsystem), или пользовательский токен ограничен делегированием и, таким образом, может получать доступ только к локальным ресурсам (как в случае аутентификации IIS NTLM), или пользователь не имеет доступа к некоторым локальные файлы, которые он хочет.

0 голосов
/ 27 июня 2009

Принимая идею Шираз и продолжая с ней ...

В своем приложении вы явно определяете учетную запись пользователя домена и пароль для доступа к 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"

Если это работает, то, конечно, было бы лучше создать и использовать служебную учетную запись специально для этой задачи, а также запретить интерактивный вход в эту учетную запись.

0 голосов
/ 26 июня 2009

Когда вы запускаете WScript.Shell, он запускается под локальной системной учетной записью, эта учетная запись имеет полные права на компьютере, но не имеет прав в Active Directory.

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

...