Запуск команд на удаленной машине

Я написал приложение wmi, которое запускает пакетный файл на удаленной машине.

Этот пакетный файл записывает выходные данные в строку каталога, переданную ему в качестве аргумента.

Когда я запускаю свое приложение и выбираю диск C в качестве выходного каталога, все работает. Но когда я выбираю сетевой диск, он почему-то не работает.

(Этот сетевой диск является диском пользователей компании и сопоставлен для каждого пользователя в сети).

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

ConnectionOptions connOptions = new ConnectionOptions();
connOptions.Impersonation = ImpersonationLevel.Impersonate;
connOptions.Username = sUsername;
connOptions.Password = sPassword;
connOptions.Authority = "NTLMDomain:" + sDomain;
connOptions.EnablePrivileges = true;
ManagementScope manScope = new ManagementScope(String.Format(@"\\{0}\ROOT\CIMV2", sHost), connOptions);
manScope.Connect();
ManagementPath managementPath = new ManagementPath("Win32_Process");
ManagementClass processClass = new ManagementClass(manScope, managementPath, objectGetOptions);
ManagementBaseObject inParams = processClass.GetMethodParameters("Create");

for (int i = 0; i < listOfJobs.Items.Count; i++)
{
   listOfJobs.SetSelected(i, true);
   inParams["CommandLine"] = listOfJobs.SelectedItem.ToString();
   ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null);
}

Пример строк работы:

Рабочий скрипт: C:\Scripts\BatchScript -p C:\Test C:\OutputDir

Ошибка сценария: C:\Scripts\BatchScript -p C:\Test U:\OutputDir

Любые идеи?


person Idanis    schedule 21.01.2013    source источник
comment
Вы должны опубликовать используемый код, чтобы помочь людям ответить на ваш вопрос.   -  person Francis P    schedule 21.01.2013
comment
Давайте посмотрим код, пожалуйста.   -  person Derek    schedule 21.01.2013
comment
@Idanis Можете ли вы уточнить свои намерения здесь? Я не уверен, что это только я, но я немного смущен контекстом вашего утверждения. Вы пытаетесь выполнить скрипт локально и удалённо регистрировать некоторые выходные данные? Или вы пытаетесь выполнить удаленно и удаленно войти в систему? Когда вы говорите, что если я запускаю ту же самую команду (с сетевым диском) вручную с удаленной машины, вы имеете в виду физический доступ к машине или вы находитесь внутри?   -  person B L    schedule 21.01.2013
comment
@glace Хорошо, извините за путаницу. Итак, у меня есть пакетный скрипт, и у меня есть приложение, которое подключается к удаленному компьютеру и запускает на нем пакетный скрипт. У меня также есть подключение к удаленному компьютеру - я управляю им через удаленный рабочий стол. Вот случаи, с которыми я сталкиваюсь: 1) Я нахожусь внутри удаленной машины (без моего приложения, просто используя удаленный рабочий стол). Затем запускаю скрипт и пытаюсь записать вывод на диск U - работает. 2) Я запускаю свое приложение для подключения к удаленному устройству, я запускаю точный скрипт и его аргументы, как и раньше - он терпит неудачу ... надеюсь, что это понятнее.   -  person Idanis    schedule 21.01.2013


Ответы (1)


Установите для параметра ImpersonationLevel значение Delegate. Олицетворение допускает только один сетевой переход, т. е. сервер может обращаться только к локальным файлам или файлам, хранящимся на клиенте. Доступ к третьей машине (сетевому диску) означает еще один прыжок, поэтому требуется делегат.

person NigelK    schedule 21.01.2013
comment
Я сделал, так что теперь я получаю исключение: The application called an interface that was marshalled for a different thread. (Exception from: HRESULT:0x80010010E (RPC_E_WRONG_THREAD)) - person Idanis; 21.01.2013
comment
Я предполагаю, что после удаленного вызова есть какое-то обновление пользовательского интерфейса? Попробуйте использовать метод Dispatcher.RunAsync для элемента пользовательского интерфейса. Сейчас я выхожу из своей зоны комфорта, поэтому, если вы все еще застряли, возможно, это должен быть новый вопрос... - person NigelK; 21.01.2013
comment
пытался найти способ сделать то, что вы предложили, но не нашел... Это показывает ошибки компиляции: var dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null); }); - person Idanis; 21.01.2013
comment
Код, который у вас был раньше, был таким, каким, я думаю, и должен быть. Я имел в виду, что происходит после кода, который вы показали? Вы показываете окно сообщения или обновляете поле на экране? Если это так, этот код необходимо передать через Dispatcher.RunAsync. Помимо этой ошибки, ваш командный файл запускается сейчас? - person NigelK; 21.01.2013