Powershell and Forms without Administrator Rights - powershell

I am working on a script using Powershell to fill out a website form. I am using my work computer which means I don't have Admin rights. Is it possible to fill out a form on a website using Powershell commands? For example, tab 4 times, keystroke "R", "A", etc., and then tab to the "Submit" button and click it?

You could use the Internet Explorer COM Object:
$ie = new-object -ComObject "InternetExplorer.Application"
$ie.navigate("https://yourURL")
while($ie.busy){sleep -mil 200}
You can then fill out the form with something like this (There are methods for getting by name/id/tagname etc)(this code might not actually work but it should be kinda similar):
$ie.Document.GetElementById("ElementID").value = "yourValue"
....
$ie.document.getElementById("buttonID").click()
The thing to watch out for is the security zone your target website is in. If you find that the Document property of the $ie object is null after calling .navigate() then you or your admin need to mark the target site as safe in the IE security settings for it to work without admin privileges.
P.S.: Here is the Documentation for the InternetExplorer.Application Object: MSDN

Related

Auto logging in to salesforce using PS on Chrome

I have the following script for logging in to salesforce on IE.
I want to login using chrome or firefox.
If I need a completely new script I will use it.
$username = "username#domain.com"
$password = "Mypassword"
$ie = New-Object -com InternetExplorer.Application
$ie.visible=$true
$ie.navigate("https://login.salesforce.com")
while ($ie.Busy -eq $true)
{
Start-Sleep -Milliseconds 1000;
}
$ie.document.getElementById("username").value= "$username
$ie.document.getElementById("password").value = "$password"
$login = $ie.document.getElementsByClassName("button r4 wide primary") | Select-Object -first 1
$login.click()
TL;DR: There's no built-in way to do what you're asking.
Let me preface this by saying that, in general, trying to automate logins in this manner is a really, really bad idea. I cannot stress enough how dangerous this is from a security perspective. I would strongly recommend against attempting to write a Powershell script to automate a login in this manner unless it is done with a fake username and password for learning/test purposes.
That being said, IE has a rich COM interface - Chrome and Firefox, not so much. You will need to install an extension to enable the same functionality.
This is evil, if you want systematic access and automation you should look into proper REST or SOAP API access, with OAuth2 flows. There's even a flow where you don't share password, the trust is established by signing a request with certificate that was earlier uploaded to SF and the user preauthorised...
This should never be part of any serious deliverable. If this gets hacked - your company / client can sue for damages.
If you really need it you can use simple GET like https://login.salesforce.com/?un=username#example.com&pw=hunter2, no need for fancy scripting. In Setup -> Login History you'll see that the method was GET instead of POST (submitting the real form). I don't think it's officially supported, they could change it anytime. It'd pass your password plaintext over the web...
Edit:
Check what your company signed. For example the Master Service Agreement
https://a.sfdcstatic.com/content/dam/www/ocms-backup/assets/pdf/misc/salesforce_MSA.pdf
(…)the Service or Content may not be accessed by more than that number
of Users, (b) a User’s password may not be shared with any other
individual(…)

How can I Navigate to a link after login using ComObject?

How can I navigate to a subsite using a ComObject
Add-Type -AssemblyName System.Windows.Forms
$woop=New-Object -ComObject 'internetExplorer.Application'
$woop.Visible= $true
$woop.Navigate("Link")
Start-Sleep 5;
$woop.document.IHTMLDocument3_getElementByID("Username-ID").value=$username
$woop.document.IHTMLDocument3_getElementByID("Password-ID").value=$password
$woop.document.IHTMLDocument3_getElementByID("Loggin Button").Click()
Start-Sleep 20 #20 Second timer to wait for the page to fully load
$woop.document.IHTMLDocument3_getElementByID("NewSiteContent-ID").Click()
This Code works like a charm for me and takes me to the new subsite.
However after I log in to the Site, I can't .Navigate to this new Site with the ComObject since I don't have the session stored anywhere.
My question: does this problem even have a solution without using Invoke Request?
I found a very good guide for this whole topic here
at the end of this Website the user shows possible things one could do like so:
Now that we're logged in, we could:
Set the $currentDocument variable to $ieObject.Document as the value is now different since a new page has been loaded.
Parse out information we need by exploring the webpage.
Automate looking for a specific post
But for some reason I cant produce this step.
I get the same Error every time:
You cannot call a method on a null-valued expression
My guesses, it cant reach the ID tag since the ComObject is still at the old Login Website since I didn't navigate to the new Link it provides after logging into the Site.
Any solutions/ideas?
Update 1.)
You can show with
ComObjectName.Windows()
the status of you're ComObject.
I saw that both the LocationURL and the LocationName points to the (login successful session) subsite after login.
Meaning the code of refreshing you're ComObject with the new Site worked.
example: $currentdocument = $woop.document
That's the point. You can't reach the element directly in an iframe. You need to get the iframe first, then use contentWindow.document to get the elements in the iframe.
For example, you can use the code below to reach an element in an iframe:
$ie.document.getElementById('iframeId').contentWindow.document.getElementById('elementId').
You can change the code according to your actual situation.
Reference link:
(1) HTMLIFrameElement.contentWindow
(2) Accessing a document's IFRAME via Powershell

Force Powershell to ask for Creds

Hoping someone can assist me... Is there a way to force powershell to prompt for Credentials before then loading another script?
I have a gui which is a series of buttons which will load various other scripts. However one or two of them require authentication with another account. So i want the button to be hit it asks for creds then runs that PS.1 file as that account.
Most i have just coded like below so it loads the script.
$Script1.Add_Click({
& 'Location of File'
})
Thanks
As Theo said solved this:
Add $cred = Get-Credential as the first command inside the Add_Click event handler scriptblock.

VS Code or InternetExplorer.Application seems to be caching my script results?

VS Code with Powershell extension
I am trying to parse a web page that I requires logging into, and am using InternetExplorer.Application
Its working up to a point, but now that I have logged in once with the script, its as if the script is caching my page results. However, if I manually go the url, im prompted to login as expected.
Ive even taken out all the code that does the login actions, but I still get the page that is only shown after login.
What can I check regarding caching of results with using "InternetExplorer.Application" via powershell?
I have my IE options set to delete browsing history on exit, so shouldn't it clear things out?
In the excerpt below, I am showing the input elements, and the ones listed are in fact the ones that are only in the document AFTER logging in, but all the code to do the logging in has been removed. Again, if I navigate to the browser manually in IE, I am prompted to login. Something must be getting cached somewhere.
However, it also happens from the command line. Not sure what to check to make sure something isnt getting cached.
$ie = new-object -com "InternetExplorer.Application"
$ie.navigate("www.something.com/client-portal")
$ie.visible=$true
$doc = $ie.Document
#-- see items on page
$doc.IHTMLDocument3_getElementsByTagName("input") | Select-Object Type,Name
... login code here, commented out then removed
[update]
https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa752093%28v%3dvs.85%29
How can one pass one or more flags to the navigate method ? Dont read from disk cache and dont add to history.
[ update 2 ]
I think it has something to do with either the app itself or powershell caching something. Strange that navigating to the site manually results in expected behavior (being required to log in) yet its as if I am permantly seen as logged in when using powershell with IE automation.

Display popup box via Powershell logon script

I know you can create powershell logon scripts and run them via Group Policy. We have a requirement where we need the user to accept the IT Usage Policy and one way I thought of doing this would be to use a login script. It would halt the login process and display a popup box after successfully logging in asking if they accept the policy (And requiring the OK/YES button to be pushed) before proceeding with login and taking the user to their desktop. Is this possible? If so, can it be set to either only run once or say every month?
If it is important, we exclusively run Windows 7 desktops.
The short answer is Yes. Here is a link to an example Provide a Yes/No Prompt in Windows PowerShell
Along with the link posted by #neolisk you should be able to cover off both sides of your question.
$a = new-object -comobject wscript.shell
$intAnswer = $a.popup("Do you want to choose Yes or No?", 0,"Confirmation",4)
It does not work when you execute the script as "logon one". There should be a costrain that inhibit the appears of messageboxes.