""" Demonstrates prompting for credentials, saving, and loggging on with marshalled credential. Also shows how to load user's profile """ import win32net, win32security, win32api, win32con import win32profile, win32cred ## Prompt for a username/pwd for local computer uiinfo={'MessageText':'Enter credentials for local machine','CaptionText':'win32cred_demo.py'} target, pwd, save=win32cred.CredUIPromptForCredentials(TargetName=win32api.GetComputerName(), AuthError=0, Flags=win32cred.CREDUI_FLAGS_DO_NOT_PERSIST|win32cred.CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX, Save=False, UiInfo=uiinfo) attrs=[ {'Keyword':'attr1', 'Flags':0, 'Value':'unicode data'}, {'Keyword':'attr2', 'Flags':0, 'Value':'character data'} ] cred={'Comment':'Created by win32cred_demo.py', 'UserName':target, 'TargetAlias': None, 'TargetName':target,'CredentialBlob':pwd, 'Flags':win32cred.CRED_FLAGS_USERNAME_TARGET, 'Persist':win32cred.CRED_PERSIST_ENTERPRISE,'Type':win32cred.CRED_TYPE_DOMAIN_PASSWORD, 'Attributes':attrs} win32cred.CredWrite(cred) pwd=None print(win32cred.CredRead(target, win32cred.CRED_TYPE_DOMAIN_PASSWORD)) ## Marshal saved credential and use it to log on mc=win32cred.CredMarshalCredential(win32cred.UsernameTargetCredential, target) th=win32security.LogonUser(mc,None,'',win32con.LOGON32_LOGON_INTERACTIVE, win32con.LOGON32_PROVIDER_DEFAULT) win32security.ImpersonateLoggedOnUser(th) print('GetUserName:',win32api.GetUserName()) win32security.RevertToSelf() ## Load user's profile. (first check if user has a roaming profile) username, domain=win32cred.CredUIParseUserName(target) user_info_4=win32net.NetUserGetInfo(None, username, 4) profilepath=user_info_4['profile'] ## LoadUserProfile apparently doesn't like an empty string if not profilepath: profilepath=None ## leave Flags in since 2.3 still chokes on some types of optional keyword args hk=win32profile.LoadUserProfile(th, {'UserName':username, 'Flags':0, 'ProfilePath':profilepath}) ## Get user's environment variables in a form that can be passed to win32process.CreateProcessAsUser env=win32profile.CreateEnvironmentBlock(th,False) ## Cleanup should probably be in a finally block win32profile.UnloadUserProfile(th, hk) th.Close()