2008-11-26 6 views
1

J'essaie de faire ce qui suit: 1. Je suis connecté en tant que compte administrateur dans ma machine XP avec SP2 exécutant VS.NET 2005 2. Cette machine dispose également d'un autre compte utilisateur1 est un compte d'invité 3. Je cours un programme en tant qu'administrateur, de ce programme je veux lancer un processus de notepad.exe qui fonctionnera sous le contexte de sécurité d'user1 4. Je veux spécifiquement employer CreateProcessasUser pour faire ceci.CreateProcessAsUser ne fonctionne pas correctement dans mes expériences

C'est le snipper de code qui vous expliquera ce que j'ai essayé ..

const string GRANTED_ALL = "10000000"; 

const int LOGON32_LOGON_INTERACTIVE = 2; 
const int LOGON32_LOGON_NETWORK = 3; 
const int LOGON32_LOGON_BATCH = 4; 
const int LOGON32_LOGON_SERVICE = 5; 
const int LOGON32_LOGON_UNLOCK = 7; 
const int LOGON32_LOGON_NETWORK_CLEARTEXT = 8; 
const int LOGON32_LOGON_NEW_CREDENTIALS = 9; 

const int LOGON32_PROVIDER_DEFAULT = 0; 
static IntPtr hToken = IntPtr.Zero; 
static IntPtr hTokenDuplicate = IntPtr.Zero; 

static void Main(string[] args) 
{ 
    int last_error = 0; 
    if(LogonUser("user1",null,"#welcome123", 
     LOGON32_LOGON_INTERACTIVE, 
     LOGON32_PROVIDER_DEFAULT, out hToken)) 
    { 
     last_error = Marshal.GetLastWin32Error(); 
     PROCESS_INFORMATION pi = new PROCESS_INFORMATION(); 
     STARTUPINFO si = new STARTUPINFO(); 
     SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES(); 
     last_error = 0; 
     last_error = Marshal.GetLastWin32Error(); 
     if(DuplicateTokenEx(hToken,UInt32.Parse(GRANTED_ALL,System.Globalization.NumberStyles.HexNumber), 
      ref sa,SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation, 
      TOKEN_TYPE.TokenPrimary,out hTokenDuplicate)) 
     { 
      last_error = 0; 
      last_error = Marshal.GetLastWin32Error(); 

      CreateProcessAsUser(hTokenDuplicate, "d:\\san\\notepad.exe", null, 
      ref sa, ref sa, false, 0, IntPtr.Zero, "d:\\san", ref si, out pi); 

      last_error = 0; 
      last_error = Marshal.GetLastWin32Error(); 

     } 
    } 

    last_error = 0; 
    last_error = Marshal.GetLastWin32Error(); 


    if (hToken != IntPtr.Zero) CloseHandle(hToken); 
    if (hTokenDuplicate != IntPtr.Zero) CloseHandle(hTokenDuplicate); 

} 

}

Pour une raison quelconque cela ne fonctionne pas .. La fonction DuplicateTokenEx est de retour en tant que code d'erreur de 1305 et je ne peux pas semblent comprendre pourquoi ..

Au lieu de DuplicateTokenEx i également utilisé le DuplicateToken , maintenant le CreateProcessAsUser renvoie un code d'erreur de 1308.

Quelqu'un pourrait jeter la lumière sur cette question .. Cela semble être une chose apparemment très simple, mais je ne peux pas le faire correctement .. [S'il vous plaît noter que je spécifiquement vouloir LogonUser, puis DuplicateToken, puis CreateProcess AsUSer]

Merci Santhosh

Répondre

-2

Voir CreateProcessAsUser() windowstations and desktops.

Mais je suggère de le faire de façon gérée:

... 
using System.Diagnostics; 
using System.Security; 
... 
... 
string progPath = @"c:\WINNT\notepad.exe"; 
ProcessStartInfo startInfo = new ProcessStartInfo(progPath); 
startInfo.WindowStyle = ProcessWindowStyle.Normal; 
startInfo.UseShellExecute = false; 
startInfo.UserName = "SomeUser"; 
SecureString password = new SecureString(); 

#region setting password 
password.AppendChar('p'); 
password.AppendChar('a'); 
... 
#endregion 

startInfo.Password = password; 
Process.Start(startInfo); 
... 
... 
Questions connexes