cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
Godlees
Frequent Visitor

Get secure Credentials

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 !

7 REPLIES 7
sakula1996
Responsive Resident
Responsive Resident

Hi @Godlees ,

 

You can use input variable and change data type to sensitive text

 

Hope this helps 🙂

sakula1996_0-1615581911638.png

 

Thanks,

-Sachin

 

burque505
Helper V
Helper V

@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:

BoxCredsFlow.png

Shots of flow, step by step, except for launching Chrome and navigating to 'https://account.box.com/login/':

Set Python path:

setpypath.png

Set Python script path:

setscriptpath.png

Run Python from the DOS prompt, storing its output into '%PythonOutput%'.

doscommand.png

Split the output with custom delimiter ',' into CredList.

split_python_output.png

Set email to CredList[0]:

credlist0.png

Set password to CredList[1]:

credlist1.png

Fill in email field:

fill_email.png

Click 'Next':

click_next.png

Fill in the password with CredList[1]:

credlist1.png

Click 'Submit':

click_submit.png

 

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

sakula1996
Responsive Resident
Responsive Resident

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 🙂

 

sakula1996_0-1616006915746.png

 

sakula1996_1-1616006989798.png

 

 

Helpful resources

Announcements
MPA Virtual Workshop Carousel 768x460.png

Register for a Free Workshop

Learn to digitize and optimize business processes and connect all your applications to share data in real time.

PWREduCon768x460.png

Join us at PWR EduCon - A Power Platform Conference

Learn from the top Power BI, Power Apps, Power Automate & Power Virtual Agents experts!

Power automate tips 768x460 v2.png

Restore a Deleted Flow

Did you know that you could restore a deleted flow? Check out this helpful article.

Users online (2,594)