Запуск скрипта vbs из общей сети с разными учетными данными (winforms)

У меня есть требование, чтобы выполнить vbscript, расположенный на общем сетевом диске. т.е.: \SERVER1\shared$\path\script.vbs

Чтобы подключиться к этой общей папке, мне нужно передать учетные данные, т.е.:

ДОМЕН\Админшаре 1234

Этот сценарий должен работать с учетными данными локального администратора. то есть:

.\Администратор 1234

Ведьма пользователя, которая будет выполнять exe, также имеет свои собственные учетные данные, то есть:

ДОМЕН\Пользователь 1234

Как я могу управлять этим сценарием?

Я успешно подключился к smb с соответствующими учетными данными с помощью этого класса:

using System;
using System.Runtime.InteropServices;
using BOOL = System.Boolean;
using DWORD = System.UInt32;
using LPWSTR = System.String;
using NET_API_STATUS = System.UInt32;

namespace blah
{
    class UNCAccess
    {
        // FROM: https://ericwijaya.wordpress.com/2013/02/06/access-remote-file-share-with-username-and-password-in-c/
        //
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        internal struct USE_INFO_2
        {
            internal LPWSTR ui2_local;
            internal LPWSTR ui2_remote;
            internal LPWSTR ui2_password;
            internal DWORD ui2_status;
            internal DWORD ui2_asg_type;
            internal DWORD ui2_refcount;
            internal DWORD ui2_usecount;
            internal LPWSTR ui2_username;
            internal LPWSTR ui2_domainname;
        }
        [DllImport("NetApi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern NET_API_STATUS NetUseAdd(
        LPWSTR UncServerName,
        DWORD Level,
        ref USE_INFO_2 Buf,
        out DWORD ParmError);
        [DllImport("NetApi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern NET_API_STATUS NetUseDel(
        LPWSTR UncServerName,
        LPWSTR UseName,
        DWORD ForceCond);
        private string sUNCPath;
        private string sUser;
        private string sPassword;
        private string sDomain;
        private int iLastError;
        public UNCAccess()
        {
        }
        public UNCAccess(string UNCPath, string User, string Domain, string Password)
        {
            login(UNCPath, User, Domain, Password);
        }
        public int LastError
        {
            get { return iLastError; }
        }
        /// <summary>
        /// Logs in to the shared network with the provided credentials
        /// </summary>
        /// <param name="UNCPath">unc</param>
        /// <param name="User">user</param>
        /// <param name="Domain">domain</param>
        /// <param name="Password">password</param>
        /// <returns>TRUE OK, ELSE FALSE</returns>
        public bool login(string UNCPath, string User, string Domain, string Password)
        {
            sUNCPath = UNCPath;
            sUser = User;
            sPassword = Password;
            sDomain = Domain;
            return NetUseWithCredentials();
        }
        private bool NetUseWithCredentials()
        {
            uint returncode;
            try
            {
                USE_INFO_2 useinfo = new USE_INFO_2();

                useinfo.ui2_remote = sUNCPath;
                useinfo.ui2_username = sUser;
                useinfo.ui2_domainname = sDomain;
                useinfo.ui2_password = sPassword;
                useinfo.ui2_asg_type = 0;
                useinfo.ui2_usecount = 1;
                uint paramErrorIndex;
                returncode = NetUseAdd(null, 2, ref useinfo, out paramErrorIndex);
                iLastError = (int)returncode;
                return returncode == 0;
            }
            catch
            {
                iLastError = Marshal.GetLastWin32Error();
                return false;
            }
        }
        ///

        /// Closes the UNC share
        ///  
        /// True if closing was successful
        public bool NetUseDelete()
        {
            uint returncode;
            try
            {
                returncode = NetUseDel(null, sUNCPath, 2);
                iLastError = (int)returncode;
                return (returncode == 0);
            }
            catch
            {
                iLastError = Marshal.GetLastWin32Error();
                return false;
            }
        }
    }
}

Затем я запустил процесс, чтобы запустить скрипт от имени администратора:

Process p = new Process();
p.StartInfo.FileName = "cscript.exe";
p.StartInfo.WorkingDirectory = @"c:\";
p.StartInfo.Arguments = "//B //Nologo " + script.FullName
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.Verb = "runas";
p.StartInfo.UserName = localAdminAccount;
System.Security.SecureString pwd = new System.Security.SecureString();
foreach (char c in localAdminPasswd) { pwd.AppendChar(c); }
p.StartInfo.Password = pwd;

Проблема в том, что когда процесс запускается с новыми учетными данными (localAdmin), я не могу найти сценарий (пользователь изменился, поэтому нет доступа к общей сети).

Я хотя это было из-за пользователя, поэтому я также попытался создать лаунчер для повышения привилегий выполнения основного приложения без взаимодействия с пользователем (еще один процесс.старт из лаунчера), который отлично работает, но затем то же самое происходит (не найдено).

Любая помощь в этом? Спасибо


person lostcitizen    schedule 17.04.2015    source источник
comment
Хотите знать, почему бы не скопировать скрипт на локальный компьютер перед его выполнением с правами локального администратора? А после выполнения локальную копию скрипта можно удалить.   -  person Abbas    schedule 17.04.2015
comment
Невозможно скопировать сценарий, поскольку он ретранслирует другие файлы на этом сервере.   -  person lostcitizen    schedule 17.04.2015


Ответы (1)


Я решил это с помощью двух лаунчеров, чтобы получить привилегии и runas в процессе запуска, так что теперь я могу запустить скрипт с необходимыми учетными данными =)

person lostcitizen    schedule 10.08.2015