VBScript: Использование WScript.Shell для выполнения программы командной строки, которая получает доступ к активному каталогу

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

  • Подключается к активному каталогу, который находится на том же домене, что и сервер, который предназначен для получения значения атрибута. Я поиск 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 специальные разрешения в файле? Я проверила их, и разрешение на выполнение есть. Как правило, второй аргумент я передаю . Запуск () метод будет 6, я хотел, чтобы это было 1 для отладки.

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

Ответ на: "VBScript: Использование WScript.Shell для выполнения программы командной строки, которая получает доступ к активному каталогу"

Количество ответов:4

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

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

Принимая идею Шираз и работает с ним ...

В вашем приложении вы четко определяете учетную запись пользователя домена и пароль для доступа к AD?

При явном выполнении приложения может быть по своей сути с помощью ваших учетных данных (ваш в настоящее время зарегистрирован в доменной учетной записи) для допроса AD. Однако при вызове приложения из скрипта я не уверен, что приложение находится в контексте системы. Пример

A 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"

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

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

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

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

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

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

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

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

Вопрос оказался связан с сертификатом. Служба WCF, вызванная консолью, использует сертификат X509 для проверки подлинности, который устанавливается на серверах, с которых размещается и работает этот скрипт.

На других серверах, где потребляются те же сервисы, сертификаты были настроены следующим образом:

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

Как они работали в контексте ИИС. Однако, когда сценарий был запущен, как это было бы в производстве, это в контексте самих пользователей. Таким образом, сценарий должен быть изменен на следующее:

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

После того, как это изменение было сделано, все было хорошо. Спасибо всем, кто предложил помощь.