12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- """
- 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()
|