Die Ausführung von code in einem anderen Benutzer-Kontext
Ich habe eine Anwendung mit einem manifest, das erfordert, die als administrator ausgeführt, aber ein Teil der app ist das anzeigen eines Laufwerks mit WNetAddConnection2, die ich glauben verlangt, führen Sie in die normal-user-Kontext aufgrund Anmeldeinformationen etc. Gibt es eine Möglichkeit zum ausführen dieses Stück code in die normal-user-Kontext, ohne die Schaffung einer separaten Prozess.
BEARBEITEN
Aus den Kommentaren habe ich so weit gekommen, aber es funktioniert nicht. Ich erwartete es nicht zu, da ich nicht wirklich verstehe durchaus, wie sollte ich diesen verwenden. Vielleicht ist es am besten, wenn ich öffnen Sie eine neue Frage?
class Program
{
[DllImport("advapi32.DLL")]
public static extern bool ImpersonateLoggedOnUser(IntPtr hToken);
[DllImport("advapi32.DLL")]
public static extern bool RevertToSelf();
static void Main(string[] args)
{
IntPtr phToken = IntPtr.Zero;
ImpersonateLoggedOnUser(phToken);
MapDrives();
RevertToSelf();
}
}
BEARBEITEN
Wenn der aktuelle Benutzer hat admin-Rechte, dann der wichtigste Prozess erhoben mit dem manifest, in dem code, die ist erhöht, ich möchte einen Befehl ausführen, in der der Nutzer nicht mit erhöhten rechten Platz wie diesem zu haben scheint, verschiedene Umgebungsvariablen, etc. Ich glaube, dass sobald ein thread gestartet wird, kann es nicht die Veränderung selbst, die es braucht, um führen Sie einen neuen ein.
- Die Art und Weise, um die aktuelle Benutzer-Authentifizierung token wird durch WindowsIdentity.GetCurrent().Token. Ich denke aber, in deinem Fall wird es wieder die token der Benutzer "administrator" (wie Sie Ihre Anwendung als administrator ausgeführt).
- Dies ist der Identitätswechsel. Eine sehr praktische nuget package und die post, um das gleiche zu erreichen durch
LogonUser()
p/invoke-Aufruf.
Du musst angemeldet sein, um einen Kommentar abzugeben.
werfen Sie einen Blick auf Eine kleine C# - Klasse für die Identität eines Benutzers code project Artikel. Es implementiert eine Klasse IDisposable (das löst die Authentifizierung token, die nach Ihrer Nutzung). Die ich gesehen habe .NET-code undicht, der durch die nicht Freigabe der Identitätswechsel-Token.
Können Sie die Identität eines Benutzers nur für einen block von code, der auf die Netzwerk-Ressource, die Sie zugreifen müssen, als ein anderer Benutzer. Ihr code Aussehen
Ich hoffe, es hilft.
Zuerst müssen Sie erhalten die Benutzer-token, die Sie wollen, starten Sie die app, Sie können dies tun, indem WTSQueryUserToken. Wenn der Benutzer noch nicht angemeldet, können Sie LogonUser Win32-API einen neuen beantragen, in eine neue Sitzung. Erhalten Sie alle Sitzungen auf Ihrem computer, die Sie verwenden können WTSEnumerateSessions.
Dann, nachdem Sie das token, das Sie verwenden können, CreateProcessAsUser oder sonst ImpersonateLoggedOnUser Win32-APIs.
Bitte stellen Sie sicher, dass call
CloseHandle
auf die Griffe, die Sie erhalten, sind Sie besonders schlecht Lecks für diese Art von Arbeit.Ich bin nicht sicher, dies ist ein Weg, dies zu tun, ohne das erstellen eines neuen Prozess, ImpersonateLoggedOnUser funktioniert nur von einem service, und ich nicht wollen, um die Anmeldeinformationen bereitzustellen.
mich korrigieren, wenn ich falsch bin
LogonUser()
p/invoke-Aufruf.