28 votes

Comment interagir par programmation avec winlogon?

J'ai un Service Windows que je veux utiliser de programmation pour déverrouiller le poste de travail, à l'aide du compte nom d'utilisateur et mot de passe.

Cet article https://technet.microsoft.com/en-us/library/dn751047(v=ws.11).aspx explique l'authentification d'ouverture de session de flux de travail sous Windows dans l'image suivante: authentication workflow

Comme vu ci-dessus, à l'étape 5, l'utilisateur saisit les informations d'identification dans la Connexion de l'INTERFACE utilisateur. Ce que je veux réaliser est d'avoir le Service Windows entrée les informations d'identification et ont winlogon effectuer la connexion.

Il n'y a pas de winlogon API pour atteindre cet objectif. Comme on le voit dans d'autres questions, à l'aide de winapi de l' LogonUser fonction effectue correctement l'authentification et renvoie un jeton, mais il ne parvient pas à passer le bureau de l'application et la Connexion de l'INTERFACE utilisateur sur l'écran.

La plupart des articles et des réponses indice vers les informations d'identification de fournisseurs, mais tous les fournisseurs d'informations d'identification des échantillons nécessitent une interaction de l'utilisateur avec le Connexion de l'INTERFACE utilisateur.

Mise à jour: je vois que certains utilisateurs n'ont pas vraiment compris la question et proposent des solutions qui ne sont pas utiles pour mon cas. Le flux de travail que je suis en train de réaliser est le suivant:

  1. Service Windows démarre sur Windows boot (fait).
  2. Même service Windows dispose d'un service web et accepte des requêtes HTTP via une API (fait).
  3. L'utilisateur fournit des informations d'identification pour le service par le biais de l'API à partir d'un autre appareil (un fait).
  4. Informations d'identification fournies sont utilisés pour se connecter au poste de travail.
    4.1 fournit les informations d'identification sont utilisées pour déverrouiller le poste de travail en cas de lock (WinKey + L).
  5. (Facultatif) Le service expose les comptes Windows via l'API.
  6. (Facultatif) L'utilisateur est en mesure de spécifier pour le service de ce compte qui veut l'utiliser pour la connexion.

Pour l'instant, je suis intéressé à faire les étapes 4 et 4.1.

3voto

Geoff Chappell Points 21

Juste en passant... Mais n'est-ce pas là, au milieu de Microsoft échantillons, un fournisseur d'informations d'identification qui prend asynchrone d'entrée? J'ai certainement écrit un qui se connecte sur un utilisateur qui scanne l'acceptable d'empreintes digitales n'importe quelle vignette s'affiche. Pour moi, cela signifie que l'interaction avec LogonUI doivent pas être plus implicite, mais peut-être que je suis absent quelque chose.

Mais peut-être que je ne suis pas. Bien que je ne doute pas de l'intention de faire de l'asynchrone d'entrée d'un utilisateur d'agir sur le matériel, comme avec la numérisation d'un doigt, je ne me souviens pas cela comme une règle. Si elle ne l'est pas, alors vous pouvez avoir votre option de programme dans le formulaire de présenter les informations d'identification comme si ils ont été recueillis de manière asynchrone, non à partir d'un périphérique qui n'est évidemment relié à l'ordinateur, mais de votre côté-canal de HTTP avec qui sait quoi.

Donc, pouvez-vous avoir un fournisseur d'informations d'identification d'écouter pour la RPC à partir de votre service de notification des informations d'identification que votre service a recueilli par l'intermédiaire de son canal latéral? Ou demandez à votre service pour écouter de la RPC à partir de votre fournisseur d'informations d'identification de demander à ce que les informations d'identification sont encore disponible? J'ai peut-être pas surpris si un sens est fermé hors de la sécurité, de même - mais j'aurais pensé l'un ou l'autre peut être fait au travail.

Si vous voulez faire de tout cela, je ne veux pas entrer dans.

1voto

MrMikeJJ Points 94

Non pas que je tolère le faire, mais simplement vous donner une solution au problème. Et ce n'est pas par programmation de l'interaction avec le processus WinLogon. Il est par programme de travail autour d'elle.

Utiliser Windows Autologin propriété. Et de le redémarrer pour changer d'utilisateur. Remarque: cette liste n'impliquent de stocker le Mot de passe dans la base de registre, en texte clair.

Spécifiquement ces regkeys

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoAdminLogin HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultPassword

* Edit *

Aide à la 4. N'aide pas à l'article 4.1. Sauf si vous voulez redémarrer pour déverrouiller ce dont je doute.

Une autre alternative qui semble prometteur \ mérite d'être étudié est mentionné sur une ancienne question https://stackoverflow.com/a/35173886/4640588

0voto

Remko Points 4498

J'ai écrit un commercial solution pour ce faire, appelé SasLibEx. SasLibEx est une bibliothèque, destinée aux développeurs, en soutenant c/c++ et delphi en mode natif.

SasLibEx pouvez:

  • Simuler Ctrl Alt Del (Secure Attention Sequence)
  • Annuler Ctrl Alt Del
  • Verrouiller La Station De Travail
  • Déverrouiller la station de travail (sans références)
  • Désactiver Ctrl Alt Del
  • Activer Ctrl Alt Del de nouveau
  • Annuler l'attente de l'UAC demande
  • Est Bureau Verrouillé

Voir https://www.remkoweijnen.nl/blog/tag/saslibex/

0voto

J'avais presque les mêmes exigences de sélénium en fonction du cadre que je suis bâtiment. Longue histoire courte, j'ai besoin d'exécuter une application dans le windows de la station de l'utilisateur (WinSTA0) - ce qui signifiait qu' un utilisateur doit être enregistré dans une VM.

J'ai déjà fait un projet avec un gestionnaire d'informations d'identification pour atteindre le flux de travail suivant:

  • Démarrer une machine virtuelle, copie composants avec Powershell
  • Installer CredManager, le reboot de la VM
  • Cred manager crée un utilisateur aléatoire, l'enregistre dans une base de données
  • Se connecte avec l'utilisateur
  • L'utilisateur a autostart dans le registre d'une application et l'application démarre un serveur web peut être contacté à tourner le sélénium sessions

Si je comprends vos exigences correctement, vous aurez besoin pour créer un Gestionnaire d'informations d'Identification qui permettra de présenter un serveur (http, de canaux nommés, etc) pour être en contact avec les informations d'identification de connexion de voiture - pas besoin de passer du temps sur l'INTERFACE utilisateur ici. Utiliser l' Advice méthode dans votre ITestWindowsCredentialProvider de la mise en œuvre de démarrer votre serveur et l' UnAdvice pour l'arrêter.

Je suggère ce qui suit pour vous aider à y arriver:

  • Utilisation externe du service de journalisation (comme l'app-perspectives) pour obtenir la rétroaction de votre service et de faciliter le débogage
  • Utiliser une machine virtuelle comme une bonne pratique de provoquer une défaillance critique dans Winlogon rendre l'ordinateur inutilisable.
  • Utiliser try catch sur le niveau plus élevé sur l'ensemble de vos méthodes de composant COM de la mise en œuvre d'avaler exception pour enregistrer winlogon se bloque

Aussi, pour l'image plus grande, vous devrez avoir à l'esprit que tous ces processus ont accès différents (et la durée de vie des composants COM) pour des stations windows, les ordinateurs de bureau et exécuter en tant qu'utilisateurs différents. Je ne pense pas cependant que ce sera utile pour vous beaucoup.

Vous pouvez trouver la base des informations d'identification du gestionnaire de code ici: https://github.com/phaetto/windows-credentials-provider

0voto

Alexander Points 632

Votre tâche consiste à implémenter des interfaces de fournisseur d'informations d'identification et au point où votre service reçoit des informations d'identification, elles peuvent être facilement transmises à LogonUI - regardez cette réponse .

L'objectif est d'implémenter la vignette par défaut qui peut regrouper ces informations d'identification.

Mon propre fournisseur d'informations d'identification a également un comportement de connexion / déverrouillage automatique dans certains cas d'utilisation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X