Avatar billede frostholm Praktikant
24. juni 2009 - 11:16 Der er 4 kommentarer og
1 løsning

Køre en app som administrator

jeg skal lave et kald til SetComputerNameEx(COMPUTER_NAME_FORMAT.ComputerNamePhysicalDnsHostname, NewHostname);

Dette kræver admin rettigheder for at kunne gøre det runtime, men jeg har så fundet denne class på nettet som skulle rette bruger under kørsel.

public class ImpersonateUser
    {
        public const int LOGON32_LOGON_INTERACTIVE = 2;
        public const int LOGON32_PROVIDER_DEFAULT = 0;

        WindowsImpersonationContext impersonationContext;

        [DllImport("advapi32.dll")]
        public static extern int LogonUserA(String lpszUserName,
        String lpszDomain,
        String lpszPassword,
        int dwLogonType,
        int dwLogonProvider,
        ref IntPtr phToken);
        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int DuplicateToken(IntPtr hToken,
        int impersonationLevel,
        ref IntPtr hNewToken);

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool RevertToSelf();

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

        public bool impersonateValidUser(String userName, String domain, String password)
        {
            WindowsIdentity tempWindowsIdentity;
            IntPtr token = IntPtr.Zero;
            IntPtr tokenDuplicate = IntPtr.Zero;

            if (RevertToSelf())
            {
                if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
                LOGON32_PROVIDER_DEFAULT, ref token) != 0)
                {
                    if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
                    {
                        tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                        impersonationContext = tempWindowsIdentity.Impersonate();
                        if (impersonationContext != null)
                        {
                            CloseHandle(token);
                            CloseHandle(tokenDuplicate);
                            return true;
                        }
                    }
                }
            }
            if (token != IntPtr.Zero)
                CloseHandle(token);
            if (tokenDuplicate != IntPtr.Zero)
                CloseHandle(tokenDuplicate);
            return false;
        }

        public void undoImpersonation()
        {
            impersonationContext.Undo();
        }
    }


jeg har lavet kald til if(iu.impersonateValidUser(textBox2.Text,textBox1.Text,textBox3.Text))

men jeg får altid fejl, at info ikke er validt.

Jeg kalder med blank i domain, og mine login info til pc. Jeg køre ikke på et domain.

Hvad skal jeg gøre, eller er der smartere måder at løse problemet på. VI snakker c #
Avatar billede Syska Mester
24. juni 2009 - 13:19 #1
Hvis du reelt er admin på computeren, kan du vel bare højre klikke og vælge "Run as Administrator" ... ?
Avatar billede arne_v Ekspert
28. juni 2009 - 20:33 #2
Prøv om du kan få en fejl tekst ud med:

throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
Avatar billede arne_v Ekspert
04. august 2009 - 03:27 #3
frostholm ?
Avatar billede frostholm Praktikant
18. november 2010 - 11:34 #4
Lukker denne, tak for hjælpen, kan ikke se jeg kan give point
Avatar billede Syska Mester
18. november 2010 - 11:36 #5
Det kræver jo at vi smider et svar ... men det kommer jo så an på om du har kunnet bruge vores information til noget, derefter kan vi så ligge et svar.

mvh
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

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