.... Я почти уверен, что "правильное" использование включает где-то зашифрованную версию пароля, хотя даже это ненадежно, поскольку ключ должен быть известен.

у запустить процесс с правами администратора. Когда я запускаю приведенный ниже код, процесс жалуется, говоря, что ему нужны права администратора:

public class ImpersonationHelper : IDisposable
{
    IntPtr m_tokenHandle = new IntPtr(0);
    WindowsImpersonationContext m_impersonatedUser;

    #region Win32 API Declarations

    const int LOGON32_PROVIDER_DEFAULT = 0;
    const int LOGON32_LOGON_INTERACTIVE = 2;    //This parameter causes LogonUser to create a primary token.

    [DllImport("advapi32.dll", SetLastError = true)]
    public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
    int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

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

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public extern static bool DuplicateToken(IntPtr ExistingTokenHandle,
    int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);

    #endregion

    /// <summary>
    /// Constructor. Impersonates the requested user. Impersonation lasts until
    /// the instance is disposed.
    /// </summary>
    public ImpersonationHelper(string domain, string user, string password)
    {
        // Call LogonUser to obtain a handle to an access token.
        bool returnValue = LogonUser(user, domain, password,
            LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
            ref m_tokenHandle);
        if (false == returnValue)
        {
            int ret = Marshal.GetLastWin32Error();
            throw new System.ComponentModel.Win32Exception(ret);
        }

        // Impersonate
        m_impersonatedUser = new WindowsIdentity(m_tokenHandle).Impersonate();
    }

    #region IDisposable Pattern

    /// <summary>
    /// Revert to original user and cleanup.
    /// </summary>
    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            // Revert to original user identity
            if (m_impersonatedUser != null)
                m_impersonatedUser.Undo();
        }

        // Free the tokens.
        if (m_tokenHandle != IntPtr.Zero)
            CloseHandle(m_tokenHandle);
    }

    /// <summary>
    /// Explicit dispose.
    /// </summary>
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    /// <summary>
    /// Destructor
    /// </summary>
    ~ImpersonationHelper()
    {
        Dispose(false);
    }

    #endregion
}

using (new ImpersonationHelper("xxx.blabla.com", "xxxx", "xxxx"))
{
    if (!string.IsNullOrEmpty(txtFilename.Text))
        Process.Start(txtFilename.Text);
}

Ответы на вопрос(2)

Решение Вопроса

Начать новый процесс как другой пользователь

Пример кода:

System.Diagnostics.Process proc = new System.Diagnostics.Process();
System.Security.SecureString ssPwd = new System.Security.SecureString();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.FileName = "filename";
proc.StartInfo.Arguments = "args...";
proc.StartInfo.Domain = "domainname";
proc.StartInfo.UserName = "username";
string password = "user entered password";
for (int x = 0; x < password.Length; x++)
{
    ssPwd.AppendChar(password[x]);
}
password = "";
proc.StartInfo.Password = ssPwd;
proc.Start();
 Ibrahim AKGUN07 янв. 2011 г., 16:08
спасибо его работает как шарм
 HABJAN20 дек. 2016 г., 15:00
@sotn: это был просто пример ... Я добавил пароль = "", если тебе от этого станет легче :-)
 sotn21 дек. 2016 г., 07:39
это не заставило меня чувствовать себя лучше на самом деле, потому чтоstring password = "user entered password"; все еще там и назначая его"" не так много значит
 Kiquenet28 авг. 2014 г., 08:07
Что насчет UAC - глагол runas?stackoverflow.com/questions/13838954/...
 sotn20 дек. 2016 г., 14:37
НЕПРАВИЛЬНОЕ использование SecureString. Вы победили всю цель этого, храня это вpassword

//You should use SecureString like the following
SecureString password = new SecureString();
password.AppendChar('p');
password.AppendChar('a');
password.AppendChar('s');
password.AppendChar('s');

Process process = new Process();
process.StartInfo.UseShellExecute = false;
//Set the working directory if you don't execute something like calc or iisreset but your own exe in which you want to access some files etc..
process.StartInfo.WorkingDirectory = "workingDirectory";
//Full path (e.g. it can be @"C:\Windows\System32\iisreset.exe" OR you can use only file name if the path is included in Environment Variables..)
process.StartInfo.FileName = @"fileName";
process.StartInfo.Domain = "domain";
process.StartInfo.UserName = "userName";
process.StartInfo.Password = password;
process.Start();

РЕДАКТИРОВАТЬ: Я не знаю, почему за этот ответ проголосовали ниже 0, возможно, нужно немного больше объяснений. Если вы будете использовать это в неинтерактивной среде (например, в веб-приложении) и хотите запустить процесс с пользователем, у вас есть несколько вариантов использования пароля пользователя. Вы можете прочитать пароль из хранилища или из кода. Лучший способ; Вы можете хранить его в зашифрованном виде. Однако, если вы планируете использовать его в простой форме (может быть, временно или просто для проверки чего-либо и т. Д.), Вы можете использоватьSecureString так, как я описал. Принятый ответ не используетSecureString в правильном пути. Чтение пароля в строку из консоли, а затем положить его вSecureString просто НЕПРАВИЛЬНО. Принятый ответ НЕ защищает эту строку или что-то еще, а только обманывает ее. Это было главной мотивацией для меня, чтобы добавить этот ответ. Проверьтессылка.

 HABJAN18 мая 2017 г., 11:20
мой пример был просто POC. Я не понимаю, почему вы делаете из этого такое большое дело. Независимо от того, каким образом вы жестко закодировали свой пароль (строка или символ за символом), он также может быть легко прочитан из декомпилированных двоичных файлов и памяти. В определенный момент, когда ваш код выполняется в памяти, он дает указание, что добавить в SecureString. Вы можете легко установить точку останова в WinDbg и прочитать, что было передано. Моя строка в конечном итоге будет собирать мусор, и ее следов не будет. У вас в памяти тоже есть символы, их сложнее сложить. Они будут собирать мусор позже.
 HABJAN29 дек. 2016 г., 14:18
Не уверен, насколько разумно жестко закодировать пароль в коде. Если это не жестко, откуда вы это берете? Чем это отличается от моего примера?
 jpmc2602 янв. 2018 г., 22:39
"... правильное использование безопасной строки ..."видит пароль жестко закодированным как последовательность символов .... Я почти уверен, что "правильное" использование включает где-то зашифрованную версию пароля, хотя даже это ненадежно, поскольку ключ должен быть известен.
 HABJAN18 мая 2017 г., 11:20
Я не уверен, что вы знаете, но SecureString не является безопасной строкой. Это просто способ уменьшить временное окно, в котором кто-то может проверить вашу память и успешно получить конфиденциальные данные. Это не пуленепробиваемое и не должно было быть.

Ваш ответ на вопрос