Jump to content

Recommended Posts

Powershell - COM

Many Windows Business Application are now only supporting Powershell, as a scripting environment.

Like MS Exchange / SharePoint / Active Directory / MS SQL / etc.

This makes Au3 a handicapped scripting environment for administrators to work with.

But hold on !

Since 2008 Sapien Technologies has released a Powershell COM component named ActiveXPoSH, that makes the bridge between all

Download here http://www.sapien.com/blog/2008/06/25/activexposh-is-now-a-free-download/

First register an account before getting the download access http://www.sapien.com/auth

Why would you need Au3 to join PS1 ?

Well it is a hell lot easier to create GUI's in AU3 than it is in PS1, so let's marry the 2.

Here's an example script translated from there help file to AU3

;**************************************************************************
; Copyright (c) SAPIEN Technologies, Inc. All rights reserved
; This file is part of the PrimalScript 2007 Code Samples.
;
; File: ActiveXposh.vbs
;
; Comments:
;
; Disclaimer: This source code is intended only as a supplement to
;   SAPIEN Development Tools and/or on-line documentation.
;   See these other materials for detailed information
;   regarding SAPIEN code samples.
;
; THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
; KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
; IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
; PARTICULAR PURPOSE.
;**************************************************************************

#AutoIt3Wrapper_UseX64=N

Dim $ActiveXPosh

Const $OUTPUT_CONSOLE = 0
Const $OUTPUT_WINDOW = 1
Const $OUTPUT_BUFFER = 2

Func CreateActiveXPosh()
Dim $success

; Create the PowerShell connector object
$ActiveXPosh = ObjCreate("SAPIEN.ActiveXPoSH")
$success = $ActiveXPosh.Init(False) ;Do not load profiles
If $success <> 0 then
Consolewrite( "Init failed" & @CR)
endif
If $ActiveXPosh.IsPowerShellInstalled Then
Consolewrite( "Ready to run PowerShell commands" & @CR)
Else
Consolewrite( "PowerShell not installed" & @CR)
EndIf
; Set the output mode
$ActiveXPosh.OutputMode = $OUTPUT_CONSOLE
EndFunc


Func DownloadFile($URL,$Destination)
Local $Return
Dim $Command
Dim $FSO

;Download a file with PowerShell
$ActiveXPosh.Execute("$Client = new-object System.Net.WebClient")
;Note that variables are preserved between calls
; Construct a $Command
$Command = "$Client.DownloadFile('" & $URL & "','" & $Destination & "')"
ConsoleWrite ("Downloading ..." & @CR)
$ActiveXPosh.Execute($Command)

$FSO = ObjCreate("Scripting.FileSystemObject")
If $FSO.FileExists($Destination) Then
ConsoleWrite ("File transfer complete" & @CR)
Else
ConsoleWrite ("File Transfer failed" & @CR)
EndIf
Return $Return
EndFunc

Func ListServices()
Dim $outtext
; Set the $OUTPUT mode to $BUFFER
$ActiveXPosh.OutputMode = $OUTPUT_BUFFER
$ActiveXPosh.Execute("Get-WmiObject -class Win32_Service | Format-Table -property Name, State")

; Get the $OUTPUT line by line and add it to a variable
For $str In $ActiveXPosh.OUTPUT()
$outtext = $outtext & $str
$outtext = $outtext & @CRLF
Next

; Alternatively you can get the $OUTPUT as a single String
; $outtext = $ActiveXPosh.OutputString

ConsoleWrite ($outtext & @CR)
$ActiveXPosh.ClearOutput() ; Empty the $OUTPUT $BUFFER
EndFunc

; Create the actual Object
CreateActiveXPosh()

$Status = $ActiveXPosh.GetValue("(Get-Service UPS).Status")
if($Status = "Stopped") then
ConsoleWrite ("UPS Service is stopped" & @CR)
else
ConsoleWrite ("UPS Service is " & $Status & @CR)
EndIf


; List all running processes using PowerShell
$ActiveXPosh.Execute("Get-Process")

; Check if WinWord is running using PowerShell
if $ActiveXPosh.Eval("get-process winword") = 1 Then
ConsoleWrite ("Microsoft Word is running" & @CR)
Else
ConsoleWrite ("Microsoft Word is not running" & @CR)
EndIf

DownloadFile ("[url="http://izzy.org/scripts/PowerShell/activexposh.pdf","C:\Temp\activexposh.pdf"]http://izzy.org/scripts/PowerShell/activexposh.pdf","C:\Temp\activexposh.pdf[/url]")

; Use ListServices to show all services in this machine using PowerShell()
ListServices()

ConsoleWrite ("Version " & $ActiveXPosh.GetValue("$PSHOME") & @CR)

$ActiveXPosh = ""

Example how to load a PS1 command file

#AutoIt3Wrapper_UseX64=N

Dim $ActiveXPosh

Const $OUTPUT_CONSOLE = 0
Const $OUTPUT_WINDOW = 1
Const $OUTPUT_BUFFER = 2

Func CreateActiveXPosh()
 Local $success
 ; Create the PowerShell connector object
 $ActiveXPosh = ObjCreate("SAPIEN.ActiveXPoSH")
 $success = $ActiveXPosh.Init(False) ;Do not load profiles
 If $success <> 0 then
  Consolewrite( "Init failed" & @CR)
 endif
 If $ActiveXPosh.IsPowerShellInstalled Then
  Consolewrite( "Ready to run PowerShell commands" & @CR & @CR)
 Else
  Consolewrite( "PowerShell not installed" & @CR & @CR)
 EndIf
 ; Set the output mode
 $ActiveXPosh.OutputMode = $OUTPUT_CONSOLE
 $ActiveXPosh.OutputWidth = 250
EndFunc

; Create the actual Object
CreateActiveXPosh()

$PS1 = FileOpenDialog("Open PS1 Script", @ScriptDir & "\", "PS Scripts (*.ps1)")
PowerShell_Script($PS1)

Func PowerShell_Script($hPSFile)
$file = FileOpen($hPSFile, 0) ; Open read only
 If $file = -1 Then
  MsgBox(0, "Error", "Unable to open file.")
  Exit
 EndIf

Local $sCmd

While 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
 $sCmd &= $line & @CRLF
Wend
 ; ConsoleWrite("Line read: " & @CRLF & $sCmd & @CRLF)

FileClose($file)
 ExecuteCMD($sCmd)
EndFunc


Func ExecuteCMD($sPSCmd)
 Dim $outtext
 ; Set the $OUTPUT mode to $BUFFER
 $ActiveXPosh.OutputMode = $OUTPUT_BUFFER
 $ActiveXPosh.Execute($sPSCmd)

 ; Get the $OUTPUT line by line and add it to a variable
 For $str In $ActiveXPosh.OUTPUT()
   $outtext =  $outtext & $str
  $outtext =  $outtext & @CRLF
 Next

 ; Alternatively you can get the $OUTPUT as a single String
; $outtext = $ActiveXPosh.OutputString
 ConsoleWrite ($outtext & @CR)

 $ActiveXPosh.ClearOutput() ; Empty the $OUTPUT $BUFFER
EndFunc

I am running this from component from my Windows 7 x64 bit Powershell 3.0 version, and it still is working fine.

Enjoy !

ptrex

Edited by ptrex
Link to post
Share on other sites

Is ActiveXPoSH integreted in PrimalScript 2012? I cannot see a seperate download link for it!

Sound very interesting to have a bridge to PS! :)

Br,

UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to post
Share on other sites

@All

It is many years back that I downloaded this. But I think nowadays you first need to register an account, to get access to the download section.

If you click on download you get there http://www.sapien.com/auth

It is available as free standalone download.

rgds

ptrex

Edited by ptrex
Link to post
Share on other sites

Powershell - COM

Many Windows Business Application are now only supporting Powershell, as a scripting environment.

Like MS Exchange / SharePoint / Active Directory / MS SQL / etc.

Do you have a Microsoft link describing when/why Active Directory is only supported by PS?

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2021-06-05 - Version 1.5.4.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2021-06-14 - Version 1.6.5.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
Task Scheduler (2019-12-03 - Version 1.5.1.0) - Download - General Help & Support - Wiki

Tutorials:
ADO - Wiki, WebDriver - Wiki

 

Link to post
Share on other sites

Hi Water,

Oeps did I enter on your domain ;)

Let me refine what I meant.

Powershell uses uses .NET objects that are just not completely available using COM ADSI.

Therefore Powershell can and will simplify your life as administrator.

Writing a 1 liner to do the job, instead of 15 lines makes a difference.

Out of curiosity how to do you list all deleted AD object using your UDF ?

PS:

Your UDF is still very usefull don't misunderstand me !

rgds

ptrex

Link to post
Share on other sites

Hi ptrex

sorry if my post was misleading! You didn't enter on my domain.

I just like to know what goes on so I can support users of my UDF as good as possible.

I have never tried to list deleted items. Are they moved to another OU before actually being deleted?

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2021-06-05 - Version 1.5.4.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2021-06-14 - Version 1.6.5.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
Task Scheduler (2019-12-03 - Version 1.5.1.0) - Download - General Help & Support - Wiki

Tutorials:
ADO - Wiki, WebDriver - Wiki

 

Link to post
Share on other sites

Hi Water,

This PS COM utility could be a good start to move the AD UDF into PS as well ?

Since there are more features / options using the .Net objects.

Did you already tested it ?

PS : The Deleted objects where not moved to an other OU

Link to post
Share on other sites

Thanks for posting this ptrex.

I actually looked for this for a long time after powershell was released. I expected it would be created by Microsoft, but when it wasn't, I figured it would show up from ActiveState if at all. When it didn't appear there, I gave up hope for it.

Too bad I didn't know about it earlier, but it will be very handy.

Dale

Free Internet Tools: DebugBar, AutoIt IE Builder, HTTP UDF, MODIV2, IE Developer Toolbar, IEDocMon, Fiddler, HTML Validator, WGet, curl

MSDN docs: InternetExplorer Object, Document Object, Overviews and Tutorials, DHTML Objects, DHTML Events, WinHttpRequest, XmlHttpRequest, Cross-Frame Scripting, Office object model

Automate input type=file (Related)

Alternative to _IECreateEmbedded? better: _IECreatePseudoEmbedded  Better Better?

IE.au3 issues with Vista - Workarounds

SciTe Debug mode - it's magic: #AutoIt3Wrapper_run_debug_mode=Y Doesn't work needs to be ripped out of the troubleshooting lexicon. It means that what you tried did not produce the results you expected. It begs the questions 1) what did you try?, 2) what did you expect? and 3) what happened instead?

Reproducer: a small (the smallest?) piece of stand-alone code that demonstrates your trouble

Link to post
Share on other sites

Haven't tried the PS COM utility yet. I'm on vacation right now.

If a new problem arises that can't be solved with the current UDF I will do some testing with the PS COM utility.

The rewrite of the Word and Excel UDF will need my full attention during the next weeks.

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2021-06-05 - Version 1.5.4.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2021-06-14 - Version 1.6.5.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
Task Scheduler (2019-12-03 - Version 1.5.1.0) - Download - General Help & Support - Wiki

Tutorials:
ADO - Wiki, WebDriver - Wiki

 

Link to post
Share on other sites
  • 3 weeks later...

This makes Au3 a handicapped scripting environment for administrators to work with

And also for crafty indirect GUIs:

$ActiveXPosh = ObjCreate("SAPIEN.ActiveXPoSH")
$success = $ActiveXPosh.Init(False) ;Do not load profiles
; Try GUI
$Line = ''
$Line &= '[reflection.assembly]::LoadWithPartialName( "System.Windows.Forms")' & @CrLf
$Line &= '$form= New-Object Windows.Forms.Form' & @CrLf
$Line &= '$button = New-Object Windows.Forms.Button' & @CrLf
$Line &= '$button.text = "AutoIt is here!"' & @CrLf
$Line &= '$form.text = "PowerShell WinForms GUI from AutoIt"' & @CrLf
$Line &= '$form.Size = New-Object Drawing.Point 450,200' & @CrLf

; Create the label control and set text, size and location
$Line &= '$label = New-Object Windows.Forms.Label' & @CrLf
$Line &= '$label.Location = New-Object Drawing.Point 50,30' & @CrLf
$Line &= '$label.Size = New-Object Drawing.Point 300,15' & @CrLf
$Line &= '$label.text = "Enter your name and click the button:"' & @CrLf
; Create TextBox and set text, size and location
$Line &= '$textfield = New-Object Windows.Forms.TextBox' & @CrLf
$Line &= '$textfield.Location = New-Object Drawing.Point 50,60' & @CrLf
$Line &= '$textfield.Size = New-Object Drawing.Point 350,30' & @CrLf
; Create Button and set text and location
$Line &= '$button = New-Object Windows.Forms.Button' & @CrLf
$Line &= '$button.text = "Welcome to AutoIt"' & @CrLf
$Line &= '$button.Location = New-Object Drawing.Point 200,90' & @CrLf
; Set up event handler to extarct text from TextBox and display it on the Label.
$Line &= '$button.add_click({$label.Text = "Hi, " + $textfield.text})' & @CrLf
; Add the controls to the Form
$Line &= '$form.controls.add($button)' & @CrLf
$Line &= '$form.controls.add($label)' & @CrLf
$Line &= '$form.controls.add($textfield)' & @CrLf
; Display the dialog
$Line &= '$form.ShowDialog()' & @CrLf
$ActiveXPosh.Execute($Line)

Thank for your message about the Sapien Technologies News.

The point of world view

Link to post
Share on other sites
  • 1 month later...

This is exactly what I need and have been looking for for ages! but it doesn't work :-(

Is there a way to get this to create a 64bit com object? what happens is I am able to run the example and it will run commands however the command I really need to run is "Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin" so I can do exchange stuff. on my 64 bit system this cannot be done from a 32 bit instance of powershell. it just returns that the snap in is not installed.

is there a way to get this to work properly in 64bit ?

EDIT: just to check based on some other stuff I did try to add the .dll directly to windows/system32 and ran regasm 64bit to register the thing but no dice. still won't see the object if i have usex64=y

Edited by SpinningCone
Link to post
Share on other sites

@SpinningCone

I have not see a x64 version around I am afraid :-(

My only source is Google

rgds

ptrex

PS : You will need to put money on the table to buy the later version of Primal Scripts x32 and x64 compatible

http://www.sapien.com/blog/2011/06/13/back-from-teched-2011-does-it-support-sharepoint-and-exchange/

Edited by ptrex
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By DannyJ
      $sCommands1 = 'powershell.exe Get-ChildItem' $iPid = run($sCommands1   , @WorkingDir , @SW_SHOW , 0x2) $sOutput = ""  While 1     $sOutput &= StdoutRead($iPID)         If @error Then             ExitLoop         EndIf  WEnd ;~ msgbox(0, '' , $sOutput) ConsoleWrite("$sOutput") ConsoleWrite($sOutput) ConsoleWrite(@CRLF) $aOutput = stringsplit($sOutput ,@LF , 2) For $i=0 To  UBound($aOutput) - 1 Step 1     ConsoleWrite($aOutput[$i]) Next The script above reads the whole directory into a one dimensional array, but I need to work with the array, so I need to split the array into multiple dimensions.
      I have already read some forum answers here, and I have already tried these commands:
       
      Are there any way to use the $aOutput variable like in PowerShell:
      PowerShell:
      $a = Get-ChildItem $a.Mode I imagine this in AutoIt  $aOutput
      ConsoleWrite($aOutput[i].Mode) Or if I split this command into 2 dimension like:
      For $i To UBound($aOutput)-1 Step 1 ConsoleWrite($aOutput[$i][1]) ConsoleWrite($aOutput[$i][2]) Next  
    • By DannyJ
      If I try to run this script with   Get-ChildItem which means dir this script works perfectly, but If I try to run this command Get-RDUserSession, my script has the following error message:
      This command runs perfectly in PowerShell admin and I get back the values
      Get-RDUserSession -ConnectionBroker  broker.local | sort Username Or you can try this command as well
      Get-Command Get-RDUserSession If I run the above mentioned command this runs perfectly in PowerShell but not with AutoIt.
      Here is my script you can test the commands:
      #include<array.au3> $iPid = run('powershell Get-Command Get-RDUserSession'  , @WindowsDir , @SW_HIDE , 0x2) ;; This command not works in AutoIT you can test it in PowerShell but it won't work in Autoit ;$iPid = run('powershell Get-RDUserSession -ConnectionBroker  broker.local | sort Username'  , @WindowsDir , @SW_MAXIMIZE , 0x2) ; This command not works in AutoIT ;$iPid = run('powershell Get-ChildItem | sort Name'  , @WindowsDir , @SW_HIDE , 0x2) ; This runs perfectly $sOutput = ""  While 1     $sOutput &= StdoutRead($iPID)         If @error Then             ExitLoop         EndIf  WEnd ;~ msgbox(0, '' , $sOutput) $aOutput = stringsplit($sOutput , @LF , 2) _ArrayDisplay($aOutput)  
      That could be the solution of the problem if I could run, directly this PowerShell command window and Write to it and save it's values.
    • By DrLarch
      I'm trying to run this powershell command from Autoit and can't figure out how to pull it off:
      Get-ProvisionedAppxPackage -Online | Where-Object { $_.PackageName -match "xbox" } | ForEach-Object { Remove-ProvisionedAppxPackage -Online -AllUsers -PackageName $_.PackageName } I've been trying to run it many different ways including:
      $sCMD = 'Get-ProvisionedAppxPackage -Online | Where-Object { $_.PackageName -match "xbox" } | ForEach-Object { Remove-ProvisionedAppxPackage -Online -AllUsers -PackageName $_.PackageName }' RunWait(@comspec & ' /c powershell.exe -nologo -executionpolicy bypass -noprofile -Command "&' & $sCMD & '"') The problem is that it seems I'm missing something in how to escape or double the quotes. I've tried doubling the quotes in many different ways, but the end result always produces a syntax error in powershell. I could just run powershell first, then paste and run the command, then close the powershell window, but that's clunky. I'm trying to do it either via parameter (as above) or in one line like this:
      RunWait(@comspec & ' /c powershell.exe -nologo -executionpolicy bypass -noprofile -Command "&Get-ProvisionedAppxPackage -Online | Where-Object { $_.PackageName -match "xbox" } | ForEach-Object { Remove-ProvisionedAppxPackage -Online -AllUsers -PackageName $_.PackageName }"')  
    • By antonioj84
      any assistance how to incorporate this powershell command within autoit
       
      powershell.exe -nologo -executionpolicy bypass -WindowStyle hidden -noprofile -command "&Set-WinUserLanguageList -LanguageList fr-CA, en-CA -Force"
    • By Colduction
      Hello again, i have a code that changes username to favorite, my problem is how to use ObjEvent() function to catch errors, i've red Help File and Forum's Topics but i can't understand too much😐

      Here is a code (I've copied this codes from a user of AutoIt Forum):
       
      $sOldUser = "Administrator" $sNewUser = "Admin" $oUser = ObjGet("WinNT://" & @ComputerName & "/" & $sOldUser & ",user") $oComputer = ObjGet("WinNT://" & @ComputerName) $oNewUser = $oComputer.MoveHere($oUser.ADsPath, $sNewUser) Thanks for your care, I'm new to AutoIt and days should be passed with my coding and practicing to don't bother you :)❤
×
×
  • Create New...