C # Powershell Runspace как пользователь, а не учетная запись компьютера - PullRequest
1 голос
/ 20 января 2012

У меня есть сайт, на котором я пытаюсь запустить vbscript из пространства выполнения powershell (звучит странно, но это был самый простой способ, как я думал). Моя проблема в том, что скрипт powershell выполняется как учетная запись локального компьютера, а не как пользователь, который его запускает. Любая помощь по исправлению этого будет принята с благодарностью. Я попытался с помощью контекста олицетворения, найденного в http://support.microsoft.com/kb/306158, но безуспешно. Заранее спасибо.

protected void btnRemMaint_Click(object sender, EventArgs e)
    {
        txtOutput.Text = "";
        txtOutput.Text = "Remove Maintenance Results";
        txtOutput.Text += Environment.NewLine;

        string servers;
        servers = txtServers.Text.Replace(Environment.NewLine, ",");

        while (servers[servers.Length - 1].ToString() == ",")
            servers = servers.Substring(0, servers.Length - 1);

        System.Security.Principal.WindowsImpersonationContext impersonationContext;
        impersonationContext =
            ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();

        //Insert your code that runs under the security context of the authenticating user here.

        string script = "C:\\inetpub\\wwwroot\\VRS\\Admins\\PSScripts\\AMMaintMode.vbs";
        string mode = "/maint:0";
        string serv = "/server:" + servers;
        string ccserv = "/ccserver:calntmgt501";
        using (
        RunspacePool runspace = RunspaceFactory.CreateRunspacePool())
        {
            // open it
            runspace.Open();

            // create a pipeline and feed it the script text
            PowerShell pipeline = PowerShell.Create();

            pipeline.RunspacePool = runspace;
            pipeline.AddCommand("cscript");
            pipeline.AddArgument(script);
            pipeline.AddArgument(mode);
            pipeline.AddArgument(serv);
            pipeline.AddArgument(ccserv);

            // execute the script
            IAsyncResult pipeResults = pipeline.BeginInvoke();
            PSDataCollection<PSObject> pipeOutput = pipeline.EndInvoke(pipeResults);

            //pipeline.Invoke();
            for (int i = 0; i < pipeOutput.Count; i++)
            {
                txtOutput.Text += pipeOutput[i].BaseObject.ToString();
                txtOutput.Text += Environment.NewLine;
            }

            runspace.Close();
        }

        impersonationContext.Undo();

        txtServers.Text = "";
    }

выходные результаты выглядят следующим образом:

Microsoft (R) Windows Script Host версии 5.8 Copyright (C) Microsoft Корпорация. Все права защищены.

CLI режима обслуживания AppManager V2.1

Подключение к Центру управления ... Сервер calntmgt501 \ NQCCDB через Windows Аутентификация * Не удалось подключиться к серверу. Проверьте учетные данные. Ошибка: * Ошибка входа для пользователя 'BLACKROCK \ USPMVVMT001 $'.

1 Ответ

0 голосов
/ 27 января 2012

Если веб-сайт использует проверку подлинности Windows, в частности Kerberos, вам нужно будет включить делегирование.Это известно как проблема «Двойного прыжка».Точнее, вам потребуется администратор домена, чтобы включить ограниченное делегирование.«Ограниченная» часть означает, что вы хотите ограничить делегирование только теми службами, к которым должен подключаться веб-сервер.

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

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