Error thrown trying launch a webpage from a button - vb.net

I created a button and a menu item in vb.net (.NET 6). I found several answers here on SO that say the process to launching a webpage from such an event can be launched with this code:
Dim webAddress As String = "http://www.example.com/"
Process.Start(webAddress)
However, trying launch the code, I'm given the error of "system cannot find the file specified".
Looking more into it, I know that .NET 6 is running a bit differently and changed the code to the following:
Using link As New Process()
link.StartInfo.UseShellExecute = True
link.Start(New ProcessStartInfo("https://example.com"))
End Using
But still to no avail, and I am given the same error. "System cannot find the file specified." I can run addresses via the regular Windows Run prompt... but the program still cannot launch.

Following Jimi's comment to my original question, I changed the Sub to the following:
Sub LaunchWebsite(strWebpageURL As String)
Using Process.Start(New ProcessStartInfo(strWebpageURL) With {.UseShellExecute = True})
End Using
End Sub
Using this, the webpage launched in my desktop's default browser with no problem.

You can use
Respone.Redirect("http://www.example.com/")
or use javascript in server side code
Dim url As String = "http://www.example.com"
Dim s As String = "window.open('" & url + "', 'popup_window', 'width=300,height=100,left=100,top=100,resizable=yes');"
ClientScript.RegisterStartupScript(Me.GetType(), "script", s, True)
Above code open webpage in new popup window.
Regards
Aravind

Related

Run Internet Explorer as a different user

I'm trying to launch Internet Explorer with a different user to access a website that requires single sign on.
Below is the code that I'm using. It doesn't produce any errors but IE doesn't launch at all, not even the process.
Try
System.Diagnostics.Process.Start(IExplorerPath, Username, ConvertToSecureString(Password), Domain)
Success = True
Catch ex As Exception
Success = False
Error_Message = ex.Message
End Try
I also tried the following variation with the same result (nothing):
Try
Dim psi As New ProcessStartInfo()
psi.Filename = IExplorerPath
psi.UserName = Username
psi.Domain = Domain
psi.Password = ConvertToSecureString(Password)
psi.UseShellExecute = False
Process.Start(psi)
Success = True
Catch ex As Exception
Success = False
Error_Message = ex.Message
End Try
This is the ConvertToSecureString function:
Function ConvertToSecureString(ByVal str As String)
Dim password As New SecureString
For Each c As Char In str.ToCharArray
password.AppendChar(c)
Next
Return password
End Function
Ok, I've been searching a lot a solution for this and if you have it you deserve a Nobel price. In the mean time, if it helps anyone this is the workaround that I had to use:
Use Process.Start to run a .bat file that contains the following code:
runas /user:User#Domain.com "C:\Program Files\Internet Explorer\iexplore.exe"
Then, when the command prompt appears I use the Send Keys to type in the password and press Enter.
This launches IE with different credentials. But again, there should be a better way.
This may / may not work. Try to launch your website that requires single sign on in "CHROME", hit F-12, go to Application Tab -> Cookies -> Click on your site link. on left hand side look for something that represent your session id, may be JSESSIONID or similar, copy that. Now open your Internet Explorer, hit F-12 and manually create that JSESSIONID by running this command in console window
document.cookie = "JSESSIONID=<your-session-id-from-chrome"
hit play button to execute script
Refresh your browser

Programmatically download file (PDF) in GeckoFX VB.NET console application

I use GeckoFX to navigate to a certain website which requires me to login. So far the navigating and logging in looks something like this:
Public Flag_Completed As Boolean = False
....
Navigate("http://www.website.com/loginpage/")
While Not Flag_Completed
Application.DoEvents()
End While
Dim User As GeckoInputElement = GeckoWebBrowser1.Document.GetHtmlElementById("edit-name")
Dim Pass As GeckoInputElement = GeckoWebBrowser1.Document.GetHtmlElementById("edit-pass")
User.Value = "myUsername"
Pass.Value = "myPassword"
Dim Form = CType(GeckoWebBrowser1.Document.Forms(1), GeckoFormElement)
Form.submit()
Flag_Completed = false
While Not Flag_Completed
Application.DoEvents()
End While
...
Public Sub Navigate(ByVal URL As String, Optional ByVal LimitTimeinMinutes As Integer = 1)
Flag_Completed = False
GeckoWebBrowser1.Width = 1920
Application.DoEvents()
Try
GeckoWebBrowser1.Navigate(URL)
Catch ex As Exception
End Try
End Sub
Everything seems to work so far but I can't find a way to download the file properly. I tried using WebClient in combination with the DownloadFile() Method like so:
Dim myWebClient As New WebClient()
myWebClient.DownloadFile("http://www.website.com/path/file.pdf", "C:\Path\to\local\file.pdf")
The problem is that the WebClient is not logged in (in contrary to my GeckoFX browser (GeckoWebBrowser1). What happens is that I end up with a file that has a .pdf file extension but opening it in a text editor makes clear that the file is actually the HTML webpage that would show up on the screen when you enter the link without being logged-in. (Makes sense)
Unfortunately I have searched for more than a day now and can't find an answer to my particular problem. There doesn't seem to be a method within the GeckoFX library what could take the DownloadFile()-method's place. I found the following question on here: How to handle downloading in GeckoFX 29 which seems to be similar to my problem. Sadly for me, the solution is aimed at a Windows.Forms application in C# and I can't seem to make use of that in my own VB.NET Console-Application. Would this be the right way to approach this? If yes, any ideas? If not, how exactly?
UPDATE:
For completeness sake I will mention that I solved my particular problem (downloading a PDF behind a login) but I didn't use GeckoFX but instead used a WebClient and HttpRequests to download the file. I highly recommend the following Tutorial that explains just that: http://odetocode.com/Articles/162.aspx

Writing to Command Line Not Working

An application I need to use (USB capture utility) has a .cmd version that I can call from my Visual Basic code. I am able to launch the application and put it in "command line mode" like this:
Public Class MyClass
Dim StreamWriteUtility As System.IO.StreamWriter
Dim StreamReadUtility As System.IO.StringReader
Dim ProcessInfo As ProcessStartInfo
Dim Process As Process
Public Sub StartUSBCapture(ByVal DataStorageLocation As String)
Dim ProcessInfo As ProcessStartInfo
Dim Process As New Process
ProcessInfo = New ProcessStartInfo("C:\FW_Qualification_Suite\data-center-windows\data-center\bin\datacenter.cmd", "-c ")
ProcessInfo.CreateNoWindow = True
ProcessInfo.UseShellExecute = False 'Must be changed if redirect set to True
ProcessInfo.RedirectStandardInput = True
Process = Process.Start(ProcessInfo)
SWUtility = Process.StandardInput
While True
SWUtility.WriteLine("run") 'Looping for test to ensure this isn't a timing issue
End While
End Sub
End Class
This launches the application and opens a separate command line window that should accept further commands (i.e., capture, run, stop, etc). However, I am having trouble getting those subsequent commands to show up in the command line window. I've tried redirecting the standard input of the process, but still nothing shows up in the console window.
Can anyone tell how I'm supposed to actually get these commands from my Visual Basic program into this application?

VB.net Terminal Server application

im working on an terminal service application for personal use that allows me to list and manage all my RDP sessions via tabs (I know these exists, but using it as a small learning project also). I was wondering if anyone could help with a few items. I am trying to dynamically create and add tabs and the RDP control onto each tab. This seems to be working OK for creating the first tab page and control but fails on the subsequent ones with the error below Code below:
Dim theNewTabPage As New DevExpress.XtraTab.XtraTabPage()
theNewTabPage.Text = txtserver.Text
theNewTabPage.Name = Minute(DateTime.Now) & Second(DateTime.Now)
Dim RDPCONTROL As New AxMSTSCLib.AxMsRdpClient9NotSafeForScripting
RDPCONTROL.Dock = DockStyle.Fill
'Just a test to ensure unique name
RDPCONTROL.Name = Minute(DateTime.Now) & Second(DateTime.Now)
XtraTabControl1.TabPages.Add(theNewTabPage)
theNewTabPage.Controls.Add(RDPCONTROL)
Try
RDPCONTROL.Server = txtserver.Text
RDPCONTROL.Domain = txtdomain.text
RDPCONTROL.UserName = txtusername.Text
Dim secured As MSTSCLib.IMsTscNonScriptable = DirectCast(RDPCONTROL.GetOcx(), MSTSCLib.IMsTscNonScriptable)
secured.ClearTextPassword = txtpassword.Text
RDPCONTROL.Connect()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try`
Error when creating the second connection:
Using ex.message: exception of type 'system.windows.forms.axhost+invalidactivexstateexception was thrown
Using ex.tostring: property set of 'Server' cannot be invoked at this time
The next item is how can i detect if the RDP session was disconnected on the tab and then pop-up a message and close the required tab
After a bit of playing around i was able to solve this by calling:
XtraTabControl1.SelectedTabPage = newTabPage
Just after i added the new tab page.
Hope this helps someone in the future

Run console hidden

I'm trying to run a console window hidden while using CreateProcess(I can't use the ProcessStartInfo class because I have to run it with some other special settings)
I have tried to use the CREATE_NO_WINDOWS flag, but somehow, the console still pops up. This is the code I have:
Dim ProzessInfo = New Process_Information
Dim StartInfo = New Startup_Information, PS = New Security_Flags, TS = New Security_Flags
If CreateProcess(Nothing, target, PS, TS, False, PROCESS_CREATION_FLAG.CREATE_NO_WINDOW, Nothing, Nothing, StartInfo, ProzessInfo) = 0 Then MsgBox("Couln't start application")
What have I missed to run it hidden?
You may want to try
AppwinStyle.Hide, True
MSDN AppWinStyle
Or
EDIT:
Try This for Processes
Dim psi1 As New ProcessStartInfo("file path here")
Process.CreateNoWindow = True
Depending on what your end goal is you can always change the application type to Windows Forms Application. (Assuming you are running a console app now.)