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 User Group

Welcome to the User Group Public Preview

Check out new user group experience and if you are a leader please create your group

MBAS on Demand

Microsoft Business Applications Summit sessions

On-demand access to all the great content presented by the product teams and community members! #MSBizAppsSummit #CommunityRocks

MBAS Attendee Badge

Claim Your Badge & Digital Swag!

Check out how to claim yours today!

secondImage

Are Your Ready?

Test your skills now with the Cloud Skill Challenge.

Top Solution Authors
Users online (60,754)