J'essaie de définir un exécutable à exécuter en tant qu'utilisateur local à faible privilège (différent de l'utilisateur actuellement connecté) par défaut. La commande Windows "runas/savecred/user: nom_utilisateur appname.exe" peut le faire, mais elle nécessite que l'utilisateur connecté en cours saisisse manuellement le mot de passe de l'utilisateur différent pour la première fois. Idéalement, je veux que le programme d'installation du programme définisse les informations d'identification, donc aucune interaction ne serait nécessaire pour l'utilisateur actuellement connecté. (Je ne veux pas faire le programme en tant que service Windows pour d'autres bonnes raisons.)C++: comment créer par programme des informations d'identification d'utilisateur local dans Windows Credential Manager afin que "runas/savecred" puisse l'utiliser?
Lorsque j'ai exécuté la commande "runas", j'ai observé qu'un nouveau mot de passe Windows "ouverture de session interactive" a été créé dans Credential Manager , où "Internet ou l'adresse réseau" a été défini comme "$ computer_name \ $ nom d'utilisateur (Interactive Logon)", "Nom d'utilisateur" a été défini comme "$ computer_name \ $ username", "mot de passe" affiché comme "***** *** ", et" Persistance "a été défini comme" Entreprise ". Sur la base de cette observation, j'ai trouvé une API Win32, CredWrite, mais j'ai du mal à la faire fonctionner. J'ai eu le code d'erreur 87 (ERROR_INVALID_PARAMETER - le paramètre est incorrect.) Quand CredWrite a été appelé.
#include <windows.h>
#include <wincred.h>
#include <tchar.h>
void main()
{
char* password = "randompassword";
DWORD blobsize= 1 + strlen(password);
CREDENTIAL cred = {0};
cred.Flags = CRED_FLAGS_USERNAME_TARGET;
cred.Type = CRED_TYPE_DOMAIN_PASSWORD;
cred.TargetName = L"computername\\username";
cred.CredentialBlobSize = blobsize;
cred.CredentialBlob = (LPBYTE) password;
cred.Persist = CRED_PERSIST_LOCAL_MACHINE;
cred.UserName = L"computername\\username";
if (!CredWrite(&cred, 0))
{
std::cerr << GetLastError() << std::endl;
}
}
Les références que j'ai examinées sont énumérées en bas. J'ai été capable de créer un identifiant de type CRED_TYPE_GENERIC mais il n'a pas été reconnu par RUNAS. Je suis vraiment perplexe sur la façon de définir des champs comme TargetName et Type afin de créer par programme un identifiant de connexion interactif comme le fait RUNAS. La documentation MSDN officielle n'est pas claire et il n'y a pas d'exemple.
CredWrite: https://msdn.microsoft.com/en-us/library/windows/desktop/aa375187(v=vs.85).aspx CREDENTIAL: https://msdn.microsoft.com/en-us/library/windows/desktop/aa374788(v=vs.85).aspx L'exemple de code pour créer une information d'identification de type CRED_TYPE_GENERIC: How do I store and retrieve credentials from the Windows Vault credential manager?
voir cette url http://stackoverflow.com/questions/3729406/create-local-user-account – Proxytype
Merci pour la réponse, Proxytype.I n'a eu aucun problème pour créer le compte local à faibles privilèges avec NetUserAdd. – Batistuta
ressemble à: Certains champs ne peuvent pas être modifiés dans un identifiant existant. Cette erreur est renvoyée si un champ ne correspond pas à la valeur d'un champ protégé des informations d'identification existantes. - vous ne pouvez pas changer le paramètre après que l'utilisateur a créé, c'est moyen que vous devez le définir lorsque vous créez l'utilisateur .. https://msdn.microsoft.com/en-us/library/windows/desktop/aa375187(v= vs.85) .aspx – Proxytype