Hello everyone,
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 !
Thanks !
Hi @Godlees ,
You can use input variable and change data type to sensitive text
Hope this helps 🙂
Thanks,
-Sachin
@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.
Regards,
burque505
@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[0]:
Set password to CredList[1]:
Fill in email field:
Click 'Next':
Fill in the password with CredList[1]:
Click 'Submit':
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[0]
SET password TO CredList[1]
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\'']
Regards,
burque505
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?
Thanks !
Hi @Godlees, the use of Box is only intended as an example. You can substitute any site that requires a username and password.
The credentials are stored on the user's computer using Windows Credential Manager so the bot can access them without requiring the user to enter them.
Regards,
burque505
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 🙂