Изпълнение на команди на отдалечена машина

Написах 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. Impersonate позволява само един мрежов скок, т.е. сървърът може да има достъп само до файлове локално или до тези на клиента. За достъп до трета машина (мрежовото устройство) означава още един скок, следователно е необходим делегат.

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