Как запустить процесс, который взаимодействует с рабочим столом сервера в asp.net 3.5 через iis7?

Ответов много, попробуйте то-то, но ничего не работает. В доступе отказано. Мы запускаем приложение на сервере и автоматизируем его для выполнения определенных быстрых задач. Конечно, я могу запустить его ... (но он не может работать скрытно, он должен работать в режиме реального рабочего стола).

Я пробовал всевозможные техники повышения / олицетворения. Да, я выбрал IIS-взаимодействие с рабочим столом. В web.config у меня есть флаг олицетворения ...

Вот соответствующий код с некоторыми закомментированными попытками:

private const int WM_CLOSE = 16;
private const int BN_CLICKED = 245;
private const int LB_GETTEXT = 0x0189;
private const int LB_GETTEXTLEN = 0x018A; 
private const int WM_SETTEXT = 0X000C;

public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
public const int LOGON32_LOGON_NEW_CREDENTIALS = 9;

WindowsImpersonationContext impersonationContext; 

/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

[DllImport("user32.dll", CharSet = CharSet.Unicode)]
protected static extern int GetWindowTextLength(IntPtr hWnd);

[DllImport("user32.dll")]
protected static extern bool IsWindowVisible(IntPtr hWnd);

[DllImport("user32.dll", CharSet = CharSet.Unicode)]
protected static extern int GetWindowText(IntPtr hWnd, StringBuilder strText, int maxCount);

[DllImport("advapi32.dll")]
public static extern int LogonUserA(String lpszUserName,
String lpszDomain,
String lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int DuplicateToken(IntPtr hToken,
int impersonationLevel,
ref IntPtr hNewToken);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool RevertToSelf();

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool CloseHandle(IntPtr handle);

[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool ShowWindow(IntPtr hWnd, ShowWindowCommands nCmdShow);

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr GetProcessWindowStation();

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr GetThreadDesktop(int dwThreadId);

[DllImport("kernel32.dll", SetLastError = true)]
private static extern int GetCurrentThreadId();

public void findOurProcess(string filePath)
{
    IntPtr hwnd = IntPtr.Zero;
    IntPtr hwnd_select = IntPtr.Zero;
    IntPtr hwndChild = IntPtr.Zero;
    DateTime timer;
    TimeSpan diff;
    int processid;
    string username = "Programmer";

    clsImpersonate cls = new clsImpersonate();
    try
    {
        IntPtr token = cls.ImpersonateUser(username, Environment.MachineName, "RoboMan");
        using (WindowsImpersonationContext impersonatedUser = WindowsIdentity.Impersonate(token))
        {

            //Process process = new Process();
            //ProcessStartInfo info = new ProcessStartInfo();
            //info.FileName = fileName;
            //info.Arguments = argument;

            //process.StartInfo = info;
            //process.Start();

            //if (impersonateValidUser("Programmer", "", "Roboman"))
            //if (impersonateValidUser(username, "DESKTOP", "Roboman"))
            //{
            ProcessStartInfo psi = new ProcessStartInfo("OUR PROCESS");
            //psi.UserName = username;
            //psi.Domain = Environment.MachineName;
            //psi.Password = new System.Security.SecureString();
            //psi.Password.AppendChar('R');
            //psi.Password.AppendChar('o');
            //psi.Password.AppendChar('b');
            //psi.Password.AppendChar('o');
            //psi.Password.AppendChar('m');
            //psi.Password.AppendChar('a');
            //psi.Password.AppendChar('n');
            psi.Arguments = "-batch";
            psi.WorkingDirectory = "OUR DIRECTORY";
            psi.UseShellExecute = false;

            //myProcess.StartInfo.CreateNoWindow = true;  //Maybe?
            //myProcess.Start();

            //The following security adjustments are necessary to give the new 
            //process sufficient permission to run in the service's window station
            //and desktop. This uses classes from the AsproLock library also from 
            //Asprosys.

            //IntPtr hWinSta = GetProcessWindowStation();
            //WindowStationSecurity ws = new WindowStationSecurity(hWinSta,
            //  System.Security.AccessControl.AccessControlSections.Access);
            ////ws.AddAccessRule(new WindowStationAccessRule(username,
            //  //  WindowStationRights.AllAccess, System.Security.AccessControl.AccessControlType.Allow));
            //ws.AddAccessRule(new WindowStationAccessRule(username,
            //    WindowStationRights.CreateDesktop, System.Security.AccessControl.AccessControlType.Allow));
            //ws.AcceptChanges();

            //IntPtr hDesk = GetThreadDesktop(GetCurrentThreadId());
            //DesktopSecurity ds = new DesktopSecurity(hDesk,
            //    System.Security.AccessControl.AccessControlSections.Access);
            //ds.AddAccessRule(new DesktopAccessRule(username,
            //    DesktopRights.AllAccess, System.Security.AccessControl.AccessControlType.Allow));
            //ds.AcceptChanges();

            using (Process process = Process.Start(psi))
            {
                processid = process.Id;
            }

cls.ImpersonateUser Вышеупомянутая попытка запустить раздел кода с повышенными правами от имени другого пользователя. Но не получается. Как видите, я тоже пытался использовать эту версию. Пример ImpersonateValidUser Код AsProSys также вызовет исключение «Доступ запрещен» на ws.AcceptChanges ();

0
0
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Веб-серверы работают как службы Windows. И службам Windows по умолчанию запрещен доступ к рабочему столу с Виндоус виста.

В дополнение к общим ограничениям обслуживания веб-серверы также обычно запускаются с максимально ограниченными правами пользователя. Доступ для чтения к его программе и каталогу контента - это лучшее, что они могут получить. Они всегда включены, поэтому очень уязвимы для взлома.

Насколько я понимаю, в настоящее время вы пытаетесь запустить приложение Dekstop с веб-сервера. И это в значительной степени недопустимо. Если этот делал сработает, я бы сначала задался вопросом, как быстро я могу его удалить. А потом как мне не удалось установить лимиты в первую очередь, чтобы этого не допустить. Для каждого администратора, которому когда-либо придется запускать вашу веб-страницу: хватит пытаться это сделать!

Вместо этого просто имейте приложение Helper, которое обычно устанавливается в Windows. Он должен запускаться автоматически через TaskSheduler при входе пользователя в систему. и пусть он и WebServer связываются через каналы, устройство Loopback или аналогичные способы IPC, которые приемлемы для WebServer.

Ваше право, конечно. Мы пытались сделать что-то глупое. У нас есть другой вариант. Этот вариант был проще, и я предположительно работал с ним, пока я не столкнулся с IIS. Раньше я работал там, где это было сделано. Я зря потратил время своей компании, говоря, что это возможно.

Robert Koernke 26.10.2018 13:04

Другие вопросы по теме