Avatar billede jonas82 Nybegynder
20. december 2006 - 17:43 Der er 3 kommentarer og
2 løsninger

Starte eksternt program under bestemt bruger

Jeg forsøger at få min asp.net 2.0 applikation til at starte et program, men det skal være som en bestemt bruger. Jeg bruger calc.exe som eksempel.

Først lukker den alle eksisterende calc.exe processer ned. Dette virker fint. Den får også logget ind på den rigtige bruger.

Men den får ikke startet calc.exe igen...


<%@ Page Language="C#" %>
<%@ Import Namespace="System.Security.Principal" %>
<%@ Import Namespace="System.Runtime.InteropServices" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<script runat="server">
    // Declare signatures for Win32 LogonUser and CloseHandle APIs
    [DllImport("advapi32.dll", SetLastError = true)]
    static extern bool LogonUser(
      string principal,
      string authority,
      string password,
      LogonSessionType logonType,
      LogonProvider logonProvider,
      out IntPtr token);
    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool CloseHandle(IntPtr handle);
    enum LogonSessionType : uint
    {
        Interactive = 2,
        Network,
        Batch,
        Service,
        NetworkCleartext = 8,
        NewCredentials
    }
    enum LogonProvider : uint
    {
        Default = 0, // default for platform (use this!)
        WinNT35,    // sends smoke signals to authority
        WinNT40,    // uses NTLM
        WinNT50      // negotiates Kerb or NTLM
    }

    protected void StopApplication(string name)
    {
        System.Diagnostics.Process[] myProcesses;
        myProcesses =
          System.Diagnostics.Process.GetProcessesByName(name);
        foreach (System.Diagnostics.Process instance in myProcesses)
        {
            instance.CloseMainWindow();
            instance.Kill();
            instance.Close();
        }
    }
    protected void StartApplication(string path, string args)
    {
        System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.StartInfo.FileName = path;
        proc.StartInfo.Arguments = args;
        proc.StartInfo.UseShellExecute = false;
        proc.Start();
    }
   
    protected void logonUserbtn_Click(object sender, EventArgs e)
    {
        IntPtr token = IntPtr.Zero;
        WindowsImpersonationContext impersonatedUser = null;

        try
        {
            // Create a token for DomainName\Bob
            // Note: Credentials should be encrypted in configuration file
            bool result = LogonUser("bruger", "domain",
                                    "pasword",
                                    LogonSessionType.Network,
                                    LogonProvider.Default,
                                    out token);
            if (result)
            {
                WindowsIdentity id = new WindowsIdentity(token);
               
                // Begin impersonation
                impersonatedUser = id.Impersonate();
                // Log the new identity
                Response.Write(String.Format(
                              "</p>Identity after impersonation: {0}<br>",
                              WindowsIdentity.GetCurrent().Name));
                // Resource access here uses the impersonated identity
                StopApplication("calc");
                StartApplication("calc", "");

            }
            else
            {
                Response.Write("</p>LogonUser failed: " +
                              Marshal.GetLastWin32Error().ToString());
            }
        }
        catch
        {
            // Prevent any exceptions that occur while the thread is
            // impersonating from propagating
        }
        finally
        {
            // Stop impersonation and revert to the process identity
            if (impersonatedUser != null)
                impersonatedUser.Undo();
            // Free the token
            if (token != IntPtr.Zero)
                CloseHandle(token);
        }
        // Verify the old process identity
        Response.Write(String.Format("</p>Identity after Undo: {0}<br>",
                                    WindowsIdentity.GetCurrent().Name));
    }
</script>

<html  >
<head id="Head1" runat="server">
    <title>LogonUser Test Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="logonUserbtn" runat="server" OnClick="logonUserbtn_Click" Text="LogonUser" /></div>
    </form>
</body>
</html>
Avatar billede kalp Novice
20. december 2006 - 17:46 #1
protected void StartApplication(string path, string args)
    {
      System.Diagnostics.Process.Start(path);
    }

?
Avatar billede jonas82 Nybegynder
20. december 2006 - 17:57 #2
Desværre. Den starter calc som brugeren NETZWERKDIENST - Ja jeg har tysk OS ;)

Hvilket min egen kode faktisk også gjorde fandt jeg ud af, men det skal være med den bruger som forsøges logget ind.

WindowsIdentity.GetCurrent().Name skriver ellers den bruger jeg gerne vil have det kørt under.
Avatar billede kalp Novice
20. december 2006 - 18:11 #3
måske lave en metode som denne.. så kan du lave en
if(IsCurrentUserProcess(xxx))
kør calc med det den process id


private WindowsIdentity _user = WindowsIdentity.GetCurrent();

public bool IsCurrentUserProcess(int ProcessID)
{   
string stringSID = String.Empty;   
string process = Utils.ExGetProcessInfoByPID(ProcessID, out stringSID);   
return String.Compare(stringSID, this._user.User.Value, true) == 0);
}
Avatar billede jonas82 Nybegynder
21. december 2006 - 12:27 #4
Tak for dit forslag. Jeg fandt dog ud af at det ikke behøver være så avanceret...

proc.StartInfo.UserName = "Brugernavn";
proc.StartInfo.Password = pass;

Hvis du lægger et svar så deler vi.
Avatar billede kalp Novice
21. december 2006 - 19:36 #5
Godt nok=) men ja hvis det kan gøres lettere hvorfor ikke;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester