Laden...

Forenbeiträge von neyt Ingesamt 5 Beiträge

25.02.2019 - 13:06 Uhr

Über den Start des PDF Readers habe ich leider keine Kontrolle, da dieser normalerweise direkt über ein zu öffnendes PDF Dokument gestartet wird.

Vermutlich werde ich es dann so lösen, dass ich den PDF Reader direkt nach dem 1. Prozessaufruf und einem Userwechsel "leer" starte.

25.02.2019 - 12:09 Uhr

Vielen Dank für deine Antwort.

Ich starte den Prozess nun mit folgender Methode.


ProcessImpersonator.ImpersonateProcess_WithProfile(@"C:\Program Files (x86)\...", "xxx", "xxx", "xxx");

Das Programm wird auch unter dem angegebenen User gestartet. Nur das Problem aus dem 1. Beitrag bleibt weiterhin bestehen. Es wird ein PDF Reader aus dem gestarteten Programm heraus gestartet, der aber nicht unter dem übergebenen User laufen soll, sondern unter dem User der mein C# Programm startet.

Hoffe das ist einigermaßen verständlich.


public class ProcessImpersonator
    {
        [Flags]
        enum LogonFlags
        {
            LOGON_WITH_PROFILE = 0x00000001,
            LOGON_NETCREDENTIALS_ONLY = 0x00000002
        }

        [Flags]
        enum CreationFlags
        {
            CREATE_SUSPENDED = 0x00000004,
            CREATE_NEW_CONSOLE = 0x00000010,
            CREATE_NEW_PROCESS_GROUP = 0x00000200,
            CREATE_UNICODE_ENVIRONMENT = 0x00000400,
            CREATE_SEPARATE_WOW_VDM = 0x00000800,
            CREATE_DEFAULT_ERROR_MODE = 0x04000000,
        }

        [StructLayout(LayoutKind.Sequential)]
        struct ProcessInfo
        {
            public IntPtr hProcess;
            public IntPtr hThread;
            public uint dwProcessId;
            public uint dwThreadId;
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        struct StartupInfo
        {
            public int cb;
            public string reserved1;
            public string desktop;
            public string title;
            public uint dwX;
            public uint dwY;
            public uint dwXSize;
            public uint dwYSize;
            public uint dwXCountChars;
            public uint dwYCountChars;
            public uint dwFillAttribute;
            public uint dwFlags;
            public ushort wShowWindow;
            public short reserved2;
            public int reserved3;
            public IntPtr hStdInput;
            public IntPtr hStdOutput;
            public IntPtr hStdError;
        }

        [DllImport("advapi32.dll", CharSet = CharSet.Unicode, ExactSpelling = true,
         SetLastError = true)]
        static extern bool CreateProcessWithLogonW(
            string principal,
            string authority,
            string password,
            LogonFlags logonFlags,
            string appName,
            string cmdLine,
            CreationFlags creationFlags,
            IntPtr environmentBlock,
            string currentDirectory,
            ref StartupInfo startupInfo,
            out ProcessInfo processInfo);

        [DllImport("kernel32.dll")]
        static extern bool CloseHandle(IntPtr h);

        ///
        /// This will use the Logon_NetCredentials_only value.
        /// Usefull for inter-domain scenario without trust relationship
        /// but the system does not validate the credentials.
        ///
        public static void ImpersonateProcess_NetCredentials(string appPath, string domain,
            string user, string password)
        {
            ImpersonateProcess(appPath, domain, user, password,
             LogonFlags.LOGON_NETCREDENTIALS_ONLY);
        }

        ///
        /// This will use the Logon_With_Profile value.
        /// Useful to get the identity of an user in the same domain.
        ///
        public static void ImpersonateProcess_WithProfile(string appPath, string domain,
            string user, string password)
        {
            ImpersonateProcess(appPath, domain, user, password, LogonFlags.LOGON_WITH_PROFILE);
        }

        ///
        /// Call CreateProcessWithLogonW
        ///
        private static void ImpersonateProcess(string appPath, string domain, string user,
            string password, LogonFlags lf)
        {
            StartupInfo si = new StartupInfo();
            si.cb = Marshal.SizeOf(typeof(StartupInfo));
            ProcessInfo pi = new ProcessInfo();

            //
            if (CreateProcessWithLogonW(user, domain, password,
            lf,
            appPath, null,
            0, IntPtr.Zero, null,
            ref si, out pi))
            {
                CloseHandle(pi.hProcess);
                CloseHandle(pi.hThread);
            }
            else
            {
                throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
            }
        }
    }

22.02.2019 - 10:09 Uhr

Hallo,

Ich starte ein Programm als Prozess unter einem anderen User als dieser, welche gerade angemeldet ist. Aus diesem Programm heraus werden PDF Dateien geöffnet. Das PDF Programm wird nun ebenfalls mit dem im Code festgelegten User gestartet.

Problem: Das PDF Programm kennt nun nicht die lokal installierten Drucker weil diese nur für den gerade angemeldeten User installiert sind.

Gibt es eine Möglichkeit dem Prozess die Info mitzugeben, dass nur der erste Prozess unter einem andere User gestartet werden soll?


MyProcess = new Process()
            {
                StartInfo = new ProcessStartInfo()
                {
                    UseShellExecute = false,
                    WindowStyle = ProcessWindowStyle.Normal,
                    CreateNoWindow = false,
                    FileName = @"C:\Program Files (x86)\...",
                    WorkingDirectory = @"C:\Program Files (x86)\...",
                    UserName = "xxx",
                    Domain = "xxx",
                    Password = GetSecureString("xxx")
                }
            };

Viele Grüße

28.08.2018 - 14:22 Uhr

Super, nach der Reparatur funktioniert es 👍

27.08.2018 - 11:00 Uhr

Hallo zusammen,

ich versuche über die Package-Manager-Console das "iTextSharp" Packet zu installieren. Hier die Ausgabe mit der Fehlermeldung:

Fehlermeldung:
Es wird versucht, Abhängigkeitsinformationen für das Paket "itextsharp.5.5.13" bezüglich des Projekts "Word_Template" mit dem Ziel ".NETFramework,Version=v4.6.1" zu erfassen.
Das Erfassen von Abhängigkeitsinformationen hat 28,39 ms gedauert.
Es wird versucht, Abhängigkeiten für das Paket "itextsharp.5.5.13" mit dem DependencyBehavior "Lowest" aufzulösen.
Das Auflösen von Abhängigkeitsinformationen hat 0 ms gedauert.
Aktionen zum Installieren des Pakets "itextsharp.5.5.13" werden aufgelöst.
Aktionen zum Installieren des Pakets "itextsharp.5.5.13" wurden aufgelöst.
Das Paket "iTextSharp 5.5.13" wird aus "nuget.org" abgerufen.
Das Paket "iTextSharp.5.5.13" wird dem Ordner "C:\Users\Benutzer\Desktop\C#\Word_Template\packages" hinzugefügt.
Das Paket "iTextSharp.5.5.13" wurde dem Ordner "C:\Users\Benutzer\Desktop\C#\Word_Template\packages" hinzugefügt.
Installationsfehler. Ein Rollback wird ausgeführt...
Das Paket "iTextSharp.5.5.13" ist im Projekt "Word_Template" nicht vorhanden.
Das Paket "iTextSharp.5.5.13" wird aus dem Ordner "C:\Users\Benutzer\Desktop\C#\Word_Template\packages" entfernt.
Das Paket "iTextSharp.5.5.13" wurde aus dem Ordner "C:\Users\Benutzer\Desktop\C#\Word_Template\packages" entfernt.
Das Ausführen von NuGet-Aktionen hat 970,37 ms gedauert.

Install-Package : Fehler beim Hinzufügen des Verweises auf "itextsharp".
Bibliothek nicht registriert. (Ausnahme von HRESULT: 0x8002801D (TYPE_E_LIBNOTREGISTERED))
Bei Zeile:1 Zeichen:16

  • install-package <<<< itextsharp -ProjectName Word_Template
    • CategoryInfo : NotSpecified: (:) [Install-Package], Exception
    • FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PackageManagement.PowerShellCmdlets.InstallPackageCommand){red}

Kennt jemand diesen Fehler und weiss, was zu tun ist?

Grüße
neyt