Как запустить процесс, который взаимодействует с рабочим столом сервера в ASP.NET 3.5 через IIS7? - PullRequest
0 голосов
/ 26 октября 2018

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

Я перепробовал разные способы возвышения / подражания. Да, я выбрал IIS-Interact с рабочим столом. В файле 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;
            }

the cls.ImpersonateUser Вышеприведенная попытка запустить расширенный фрагмент кода от имени другого пользователя. Но не удается. Вы можете видеть, что я также пытался использовать эту версию. Пример ImpersonateValidUser Код AsProSys также генерировал бы исключение Access-denied на ws.AcceptChanges ();

1 Ответ

0 голосов
/ 26 октября 2018

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

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

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

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

...