openmedialibrary_platform_w.../Lib/site-packages/win32/Demos/win32cred_demo.py
2016-04-14 21:54:42 +02:00

52 lines
2.2 KiB
Python

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