Simple DOM manipulation without console window or dependencies

I am writing a solution for users to open a file, and this file should go to a specific site and insert the username in the login form. This file should be available to users who are in a citrix session .

This should be extremely simple, and I discovered a way to do this through Powershell:

$aduser = Get-ADUser $env:USERNAME -Properties EmailAddress
$emailaddress = $aduser.EmailAddress

$url = "https://website.org/loginpage.asp"
$ie = New-Object -comobject "InternetExplorer.Application"
$ie.visible = $true
$ie.Navigate($url)
WaitForPage 10
$ie.Document.GetElementById("USERID").Value = $emailaddress

This works great - it opens a web page and inserts a username (email address).

However, when a user launches this from their machine, it seems impossible to hide the CMD window (if it works from .cmdor .bat), as well as the Powershell window. -WindowStyle Hiddenjust reduced the time the window appears - this is not an acceptable solution.

, , # exe ( - ). - #, (, Selenium, , ).

, , Powershell script #? -comobject script .NET, , #?


- .ps1 ( CMD):

START Powershell.exe -WindowStyle Hidden -File \\file\Folder\SK\scripts\powershell\opensite.ps1

. , #.

+4
3

, VBScript Jscript wscript.exe, . Jscript script, + Jscript. .bat, .

@if (@CodeSection == @Batch) @then
@echo off & setlocal

wscript /e:JScript "%~f0"

goto :EOF
@end // end batch / begin JScript hybrid code

var user = WSH.CreateObject("ADSystemInfo"),
    email = GetObject("LDAP://" + user.UserName).EmailAddress,
    url = "https://website.org/loginpage.asp",
    ie = WSH.CreateObject('InternetExplorer.Application');

ie.visible = true;
ie.Navigate(url);
while (ie.readyState != 4) WSH.Sleep(25);

ie.document.getElementById('USERID').value = email;

if (ie.document.getElementById('password'))
    ie.document.getElementById('password').focus();

polyglot script, .bat, .js. .js, , (, .js wscript.exe, , ) - .


.exe, script , Jscript.NET. ( script - .bat.)

@if (@CodeSection == @Batch) @then
@echo off & setlocal

for /f "delims=" %%I in ('dir /b /s "%windir%\microsoft.net\*jsc.exe"') do (
    if not exist "%~dpn0.exe" "%%~I" /nologo /target:winexe /out:"%~dpn0.exe" "%~f0"
)
"%~dpn0.exe"
goto :EOF
@end // end batch / begin JScript.NET hybrid code

import System;
import System.Diagnostics;

try {
    var wshShell:Object = new ActiveXObject("Wscript.Shell"),
        user:Object = new ActiveXObject("ADSystemInfo"),
        email:String = GetObject("LDAP://" + user.UserName).EmailAddress,
        url:String = "https://website.org/loginpage.asp",
        ie:Object = new ActiveXObject('InternetExplorer.Application');
}
catch(e:Exception) { System.Environment.Exit(1); }

ie.visible = true;
ie.Navigate(url);

// force IE window to the foreground and give it focus
var proc:System.Diagnostics.Process[] = System.Diagnostics.Process.GetProcesses();
for (var i:Int16 = proc.length, hwnd:IntPtr = IntPtr(ie.hwnd); i--;) {
    if (proc[i].MainWindowHandle === hwnd && wshShell.AppActivate(proc[i].Id)) break;
}

while (ie.readyState != 4) System.Threading.Thread.Sleep(25);
ie.document.getElementById('USERID').value = email;
if (ie.document.getElementById('password'))
    ie.document.getElementById('password').focus();
+1

, , COM- #, :

, Visual Studio :

  • Visual Studio.
  • "" ( ) " ".
  • COM.
  • , .
  • "ok".

#, COM #. , #. , , , /structs/classes/ IntelliSense.

PowerShell # Runspace Pipeline. . Runspace MSDN ( 3 ):

namespace Microsoft.Samples.PowerShell.Runspaces
{
  using System;
  using System.Collections;
  using System.Management.Automation;
  using System.Management.Automation.Runspaces;
  using PowerShell = System.Management.Automation.PowerShell;

  /// <summary>
  /// This class contains the Main entry point for this host application.
  /// </summary>
  internal class Runspace03
  {
    /// <summary>
    /// This sample shows how to use the PowerShell class to run a
    /// script that retrieves process information for the list of 
    /// process names passed to the script. It shows how to pass input 
    /// objects to a script and how to retrieve error objects as well 
    /// as the output objects.
    /// </summary>
    /// <param name="args">Parameter not used.</param>
    /// <remarks>
    /// This sample demonstrates the following:
    /// 1. Creating a PowerSHell object to run a script.
    /// 2. Adding a script to the pipeline of the PowerShell object.
    /// 3. Passing input objects to the script from the calling program.
    /// 4. Running the script synchronously.
    /// 5. Using PSObject objects to extract and display properties from 
    ///    the objects returned by the script.
    /// 6. Retrieving and displaying error records that were generated
    ///    when the script was run.
    /// </remarks>
    private static void Main(string[] args)
    {
      // Define a list of processes to look for.
      string[] processNames = new string[] 
      {
        "lsass", "nosuchprocess", "services", "nosuchprocess2" 
      };

      // The script to run to get these processes. Input passed
      // to the script will be available in the $input variable.
      string script = "$input | get-process -name {$_}";

      // Create a PowerShell object. Creating this object takes care of 
      // building all of the other data structures needed to run the script.
      using (PowerShell powershell = PowerShell.Create())
      {
        powershell.AddScript(script);

        Console.WriteLine("Process              HandleCount");
        Console.WriteLine("--------------------------------");

        // Invoke the script synchronously and display the   
        // ProcessName and HandleCount properties of the 
        // objects that are returned.
        foreach (PSObject result in powershell.Invoke(processNames))
        {
          Console.WriteLine(
                            "{0,-20} {1}",
                            result.Members["ProcessName"].Value,
                            result.Members["HandleCount"].Value);
        }

        // Process any error records that were generated while running 
        //  the script.
        Console.WriteLine("\nThe following non-terminating errors occurred:\n");
        PSDataCollection<ErrorRecord> errors = powershell.Streams.Error;
        if (errors != null && errors.Count > 0)
        {
          foreach (ErrorRecord err in errors)
          {
            System.Console.WriteLine("    error: {0}", err.ToString());
          }
        }
      }

      System.Console.WriteLine("\nHit any key to exit...");
      System.Console.ReadKey();
    }
  }
}

, , , , PowerShell , , .

, exe powershell script.

+1

C#, rojo. , /, rojo, .

static class Program
{
    private static void Main()
    {
        var startInfo = new ProcessStartInfo(@"\\file\administration\Unused\Apps\opencascade\Alternate.bat")
        {
            WindowStyle = ProcessWindowStyle.Hidden,
            UseShellExecute = false,
            CreateNoWindow = true
        };
        Process.Start(startInfo);

        var startInfo = new ProcessStartInfo("Wscript.exe", @"\\file\administration\Unused\Apps\opencascade\Alternate.js")
        {
            WindowStyle = ProcessWindowStyle.Hidden,
            UseShellExecute = false,
            CreateNoWindow = true
        };
        Process.Start(startInfo);

        var startInfo = new ProcessStartInfo("Powershell.exe",
            @"\\file\administration\Unused\Apps\opencascade\opencascade.ps1")
        {
            WindowStyle = ProcessWindowStyle.Hidden,
            UseShellExecute = false,
            CreateNoWindow = true
        };
        Process.Start(startInfo);
    }
}

, - 3 , . "" , .bat .ps1 .js. .js, , , #, .

0

All Articles