Как запустить процесс из службы WCF, размещенной на IIS? - PullRequest
9 голосов
/ 26 августа 2011

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

var processInfo = new ProcessStartInfo("C:\\Windows\\System32\\notepad.exe")
{
    UserName = "some user",
    Password = MakeSecureString("some password"),
    UseShellExecute = false,
    LoadUserProfile = true
};

Process process = Process.Start(processInfo);

Этот код работает, если я размещаю службу WCF как самостоятельное консольное приложение, работающее под учетной записью администратора, и вижу, что блокнот запущен под другим пользователем. Сбой на IIS без исключения, но процесс немедленно прекращается

process.HasExited = true;
process.ExitCode = -1073741502;

В IIS приложение WCF выполняется под пользователем с правами администратора и имеет полное доверие, определенное в web.config. Я не могу использовать само размещенное приложение, поскольку оно не поддерживает простую непрерывную доставку (например, WebDeploy с веб-фермами IIS).

Q: Как запустить процесс на стороне сервера из службы WCF, размещенной на IIS?

EDIT:
Я наткнулся на эту запись , с похожими проблемами, и я попробовал все методы там, включая все возможные варианты для Process.Start и P / Invoke с CreateProcessWithLogonW и CreateProcessAsUser. Я также попытался предоставить дополнительные разрешения пользователям. Ни один из них не будет работать с сообщениями об ошибках, идентичными сообщениям, опубликованным парнем.

Ответы [ 3 ]

4 голосов
/ 28 августа 2011

Oleksii, дело в том, что если вы размещаете службу WCF в консольном приложении, то для этого пользователя будет сеанс Windows (пользователь вошел в систему и загружен проводник Windows), и блокнот откроется и отобразится для этого пользователя, поэтомувы видите это в пользовательском интерфейсе.

когда вы размещаете свою службу WCF в IIS, будучи сервером, IIS требует и не допускает взаимодействия с пользователем, а также работает, если ни один пользователь не вошел в систему;в этом контексте отсутствует пользовательский интерфейс для размещения вашего блокнота или других приложений с поддержкой пользовательского интерфейса, вы можете выполнить процесс для разработки или других пакетных заданий, но не визуализировать приложение пользовательского интерфейса Windows, поскольку проводник Windows не загружен для вас и нет места длявизуализировать интерфейс вашего процесса.

1 голос
/ 28 августа 2011

Есть настройка apppool, чтобы удостовериться, что он загружает профиль пользователя.

loadUserProfile Optional Boolean attribute.

Specifies whether IIS loads the user profile for the application pool identity. Setting    
this value to false causes IIS to revert to IIS 6.0 behavior. IIS 6.0 does not load the 
user profile for an application pool identity.

The default value is false.

Что наряду с тем, что пользователь домена, может работать как личность с достаточными разрешениями ??Я знаю, что как минимум пользователю понадобится профиль пользователя.

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

Надеюсь, это поможет.

1 голос
/ 26 августа 2011

вот что я использую для вызова GnuPGP для шифрования. Как ваши настройки сравниваются?

private int ExecuteCommand(string arguments, string passPhrase, int timeout)
        {
            Process processObject;
            ProcessStartInfo pInfo = new ProcessStartInfo(_executablePath, arguments);


            pInfo.CreateNoWindow = true;
            pInfo.UseShellExecute = false;

            pInfo.RedirectStandardInput = true;
            pInfo.RedirectStandardOutput = true;
            pInfo.RedirectStandardError = true;
            processObject = Process.Start(pInfo);

            if (!string.IsNullOrEmpty(passPhrase))
            {
                processObject.StandardInput.WriteLine(passPhrase);
                processObject.StandardInput.Flush();
            }

            string result = processObject.StandardOutput.ReadToEnd();
            string error = processObject.StandardError.ReadToEnd();

            if (!processObject.WaitForExit(timeout))
            {
                throw new TimeoutException("GnuPG operation timeout. Waited " + timeout + " milliseconds ");
            }

            int exitcode = processObject.ExitCode;

            Error = error;
            Output = result;

            return exitcode;

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...