I been searching on the tool, but i cant find any actions to make me get the credencials from the windows credentials, or from a cloud for example.
Can i get the credentials of the costumer from a secure way and not write them to the tool?
Any help is welcome !
@Godlees, you might be able to adapt my Robin code for using Windows credentials with Python.
I apologize for not having more time at the moment, but I will try to adapt it for PAD myself in the next day or so. As a newer version Robin underpins PAD, I'm hoping it will not be difficult.
@Godlees, this post may help you if you have Python 3 installed. If not, I am going to try to adapt it to Python 2 so no DOS command is required. I prefer Python 3, but that may not be an option for all.
Prerequisite: User must have a Generic Credential installed for Box.com
TASK: Use a Generic Credential to log into Box.com at 'https://account.box.com/login/'. Populate the email and password fields, click submit.
(You will of course need to create your own appmask by creating and selecting UI Elements.)
SCREENSHOT OF FLOW:
Shots of flow, step by step, except for launching Chrome and navigating to 'https://account.box.com/login/':
Set Python path:
Set Python script path:
Run Python from the DOS prompt, storing its output into '%PythonOutput%'.
Split the output with custom delimiter ',' into CredList.
Set email to CredList:
Set password to CredList:
Fill in email field:
Fill in the password with CredList:
Here is the content of the Python script, only slightly modified from that of mrh1997's script.
#!python3 """ Access windows credentials """ from typing import Tuple import ctypes as CT import ctypes.wintypes as WT CRED_TYPE_GENERIC = 0x01 LPBYTE = CT.POINTER(WT.BYTE) LPWSTR = WT.LPWSTR LPCWSTR = WT.LPWSTR class CREDENTIAL_ATTRIBUTE(CT.Structure): _fields_ = [ ('Keyword', LPWSTR), ('Flags', WT.DWORD), ('ValueSize', WT.DWORD), ('Value', LPBYTE)] PCREDENTIAL_ATTRIBUTE = CT.POINTER(CREDENTIAL_ATTRIBUTE) class CREDENTIAL(CT.Structure): _fields_ = [ ('Flags', WT.DWORD), ('Type', WT.DWORD), ('TargetName', LPWSTR), ('Comment', LPWSTR), ('LastWritten', WT.FILETIME), ('CredentialBlobSize', WT.DWORD), ('CredentialBlob', LPBYTE), ('Persist', WT.DWORD), ('AttributeCount', WT.DWORD), ('Attributes', PCREDENTIAL_ATTRIBUTE), ('TargetAlias', LPWSTR), ('UserName', LPWSTR)] PCREDENTIAL = CT.POINTER(CREDENTIAL) advapi32 = CT.WinDLL('Advapi32.dll') advapi32.CredReadA.restype = WT.BOOL advapi32.CredReadA.argtypes = [LPCWSTR, WT.DWORD, WT.DWORD, CT.POINTER(PCREDENTIAL)] def GetGenericCredential(name:str) -> Tuple[str, str]: """ Returns a Tuple of Name and Password of a Generic Windows Credential Uses bytes in Py3 and str in Py2 for url, name and password. """ cred_ptr = PCREDENTIAL() if advapi32.CredReadW(name, CRED_TYPE_GENERIC, 0, CT.byref(cred_ptr)): username = cred_ptr.contents.UserName cred_blob = cred_ptr.contents.CredentialBlob cred_blob_size = cred_ptr.contents.CredentialBlobSize cred_str = CT.string_at(cred_blob, cred_blob_size) password = cred_str.decode('utf-16le', errors='ignore') advapi32.CredFree(cred_ptr) return username, password else: raise IOError("Failure reading credential") def main(): name, pwd = GetGenericCredential('https://account.box.com/login/') print(name + ',' + pwd) if __name__ == '__main__': main()
For the curious, here is the content of my 'script.robin' (edited to remove my username):
IMPORT 'C:\\Users\\You\\AppData\\Local\\Microsoft\\Power Automate Desktop\\Console\\Workspace\\0f5103bd-6a64-4fab-8e98-1100ab7e4517\\controlRepo.appmask' AS appmask IMPORT 'C:\\Users\\You\\AppData\\Local\\Microsoft\\Power Automate Desktop\\Console\\Workspace\\0f5103bd-6a64-4fab-8e98-1100ab7e4517\\imageRepo.imgrepo' AS imgrepo WebAutomation.LaunchChrome Url: $'''https://account.box.com/login''' WindowState: WebAutomation.BrowserWindowState.Maximized ClearCache: False ClearCookies: False BrowserInstance=> Browser SET pythonpath TO $'''\"C:\\Program Files\\Python37\\python.exe\"''' SET pyscriptpath TO $'''C:\\Users\\HP6300\\Documents\\PAD\\wincred\\box.py''' System.RunDOSCommand DOSCommandOrApplication: $'''%pythonpath% %pyscriptpath%''' StandardOutput=> PythonOutput StandardError=> PythonErrorOutput ExitCode=> PythonExitCode Text.SplitWithDelimiter Text: PythonOutput CustomDelimiter: $''',''' IsRegEx: False Result=> CredList SET email TO CredList SET password TO CredList WebAutomation.FormFilling.PopulateTextFieldCloseDialog BrowserInstance: Browser Control: appmask['Web Page \'https://account.box.com/login\'']['<input:text> \'login-email\''] Text: email EmulateTyping: True UnfocusAfterPopulate: False WebAutomation.Click BrowserInstance: Browser Control: appmask['Web Page \'https://account.box.com/login\'']['<button> \'login-submit\''] WebAutomation.FormFilling.PopulateTextField BrowserInstance: Browser Control: appmask['Web Page \'https://account.box.com/login?redirect_url=%2F\'']['<input:password> \'password-login\''] Text: password EmulateTyping: True UnfocusAfterPopulate: False WebAutomation.Click BrowserInstance: Browser Control: appmask['Web Page \'https://account.box.com/login?redirect_url=%2F\'']['<button> \'login-submit-password\'']
Hello @sakula1996 , sorry for answer today, in this case. The client need to put your credentials every time of the bot run?
I dont like for that reason, i need something where the bot get the credentials and dont interact with the client or someone.
Hello @burque505 thank you so much for answer.
The only i dont understand is why you use box? and what credentials i have to store in that cloud?
Hi @Godlees ,
You might already figured out the issue.
But, here is something I got:
If you're using "Populate text field on web page" action or "Populate text field in window" action or "Send Keys" action, you can use sensitive text input by clicking on the little box icon towards top left corner.
Hope this helps 🙂
Keep up to date with current events and community announcements in the Power Automate community.
A great place where you can stay up to date with community calls and interact with the speakers.
Check out the latest Community Blog from the community!