воскресенье, 31 июля 2011 г.

Утилита RunAs с паролем в командной строке (C#)

Альтернатива стандартной утилите RunAs с возможностью задать пароль в командной строке.

Программа делает то-же самое, что и стандартная runas.exe. Единственное отличие - возможность указать пароль напрямую, в командной строке.

Одним из возможных применений может быть выполнение пакетных заданий из под учетной записи администратора.


Синтаксис командной строки:
runasuser [-u пользователь] [-p пароль] [-d домен] someprogram.exe [параметры программы]

Ниже приведен полный исходный код:
using System;
using System.Diagnostics;
using System.Security;

namespace RunAsUser
{
    class Program
    {
        static int Main(string[] args)
        {
            string username = "", password = "", domain = "", apppath = "", arguments = "";

            for( int i=0; i<args.Length; i++)
            {
                switch (args[i].ToLower())
                {
                    case "-u":
                        username = args[++i];
                        break;
                    case "-p":
                        password = args[++i];
                        break;
                    case "-d":
                        domain = args[++i];
                        break;
                    default:
                        if (apppath == "")
                            apppath = args[i];
                        else
                            arguments += args[i] + (i<args.Length?" ":"");
                        break;
                }
            }

            if (args.Length == 0 || apppath == "" )
            {
                Console.WriteLine("\nCommand line syntax:\nrunasuser [-u user] [-p password] [-d domain] someprogram.exe [params]\n");
                return 1;
            }
            Console.WriteLine(arguments);
            return RunAs(apppath, arguments, domain, username, password);

        }
        static int RunAs(string apppath, string arguments, string domain, string username, string password)
        {
            Process userProcess;
            try
            {
                userProcess = Process.Start( apppath, arguments, username, GetSecure(password), domain);
                while (!userProcess.HasExited) ;
                return userProcess.ExitCode;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            return -1;
        }

        static SecureString GetSecure(string str)
        {
            SecureString SecureStr = new SecureString();
            foreach (char c in str)
            {
                SecureStr.AppendChar(c);
            }

            return SecureStr;
        }
    }
}

6 комментариев:

  1. как я понял это на локальном комп.?
    А возможно ли доработка для возможности выполнения на удаленном компьютере?
    Было бы интереснее "всё в одном флаконе".

    ОтветитьУдалить
    Ответы
    1. Можно добавить удаленный запуск через WMI. При этом сервис WMI должен быть запущен и файрвол не должен его фильтровать.

      Но я для этих целей использую отдельную утилиту: PsExec - http://technet.microsoft.com/en-us/sysinternals/bb896649.aspx
      Командная строка выглядит примерно так:
      psexec \\computername -c runasuser.exe -u user -p password program.exe parameters

      Удалить
  2. в 7ке не работает. по крайней мере с батниками

    ОтветитьУдалить
    Ответы
    1. Интересно, только-что проверил - все работает в семерке. Может в параметрах ошибка ? Домен надо указывать в параметре -d, а не как в стандартном runas.

      Удалить
  3. все хорошо работает, вопрос на каком языке написан исходный код и можно ли прописать сразу логин, пароль и домен в самом скрипте и скомпилировать?

    ОтветитьУдалить
  4. Язык - C#, можно скомпилировать в Visual Studio. Логин, пароль и домен можно вписать в 11-ой строке.

    ОтветитьУдалить