PowerShell nach VBScript übersetzen

KaeTuuN

Rear Admiral Pro
Registriert
Okt. 2002
Beiträge
5.305
Hallo zusammen,

ich habe gerade untenstehende Funktionen als PowerShell Skript vorliegen und benötige sie leider als VBScript. Da es um meine PowerShell Kenntnisse nicht wirklich gut bestellt ist, hoffe ich hier ein wenig Hilfe zu finden.

Code:
function get-History()
	{
		$o = @{}
		# bereits ausgeführte TS aus der History ermitteln
		$ExecutionHistory = "HKLM\SOFTWARE\Microsoft\SMS\Mobile Client\Software Distribution\Execution History\System"
		Get-ChildItem -Path "Registry::$ExecutionHistory" | % {
			$PkgID = $_.PSChildName
			$Path = $_.Name
			$_.GetSubKeyNames() | % {
				Get-ItemProperty -Path "Registry::$Path\$_" | % {
					$o.Add(($PkgID + ":" + $_._ProgramID),$_._state)
				}
			}
		} | Out-Null
		Write-Output $o
	}

function get-Advertisements()
	{
		$o = @{}
		# advertised Task Sequences
		Get-WmiObject -Namespace "root\CCM\Policy\Machine\ActualConfig" -ComputerName "localhost" -query "select * from CCM_TaskSequence" | % {
			$o.add($_.ADV_AdvertisementID,$_)
		} | Out-Null
		# advertised Packages (not members of Task Sequences)
		Get-WmiObject -Namespace "root\CCM\Policy\Machine\ActualConfig" -ComputerName "localhost" -query "select * from CCM_SoftwareDistribution" | % {
			if ( -not $o.Contains($_.ADV_AdvertisementID)) { $o.add($_.ADV_AdvertisementID,$_) }
		} | Out-Null
		Write-Output $o
	}

function get-ActiveExecutions
	{
		$o = @{} 
		Get-WmiObject -Namespace "root\CCM\SoftMgmtAgent" -ComputerName "localhost" -query "select * from CCM_TSExecutionRequest" | 
			% {	$o.Add($_.AdvertID,$_ ) } | Out-Null
		Get-WmiObject -Namespace "root\CCM\SoftMgmtAgent" -ComputerName "localhost" -query "select * from CCM_ExecutionRequestEx where TSSTep = FALSE" | 
			% {	if ($_.ProgramID -ne '*') {	$o.Add($_.AdvertID,$_ ) } } | Out-Null
		Write-Output $o		
	}

function Rerun-Advertisement($AdvID)
	{	
		Get-WmiObject -Namespace "root\ccm\scheduler" -Class ccm_scheduler_history | 
			where { $_.scheduleid -like "*$AdvID*" } | Remove-WmiObject
		$SMSCli = [wmiclass] "\root\ccm:SMS_Client"		
		Get-WmiObject -Namespace ROOT\CCM\Policy\Machine\ActualConfig -Class CCM_Scheduler_ScheduledMessage | 
			where {$_.ScheduledMessageID -like "*$AdvID*"} | 
			% { $SMSCli.TriggerSchedule($_.ScheduledMessageID) | Out-Null }
	}

function Update-MachinePolicies()
	{	
		$SMSCli = [wmiclass] "\root\ccm:SMS_Client"
		$SMSCli.RequestMachinePolicy(0) | Out-Null
	}
Ich hoffe, ihr könnt mir helfen, vielen Dank schonmal im vorraus! :)

Mfg Kae
 
Ich kann auch keine Powershell und außerdem wär mir das zu hart das alles für dich komplett umzuschreiben, aber wenn sonst keiner was antwortet schreib ich dir mal ein paar prinzipielle sachen auf die dir helfen sollten das nachzubauen.

get History listet imo hauptsächlich die Execution History auf die sich einfach in der Registry unter HKLM\SOFTWARE\Microsoft\SMS\Mobile Client\Software Distribution\Execution History\System befindet. Nachdem das eine reine output auf den screen zu sein scheint hab ich überhaupt keine ahnung was das bringen soll und wieso man das nicht im client center nachschaut wenn mans braucht, aber prinzipiell sollte das ja kein problem sien für dich ist ja nur eine registry query und er leist halt programid und package id und state aus... Der trick dabei wäre dass die program id direkt ein schlüssel unter System ist und die anderen 2 sind reg_szs die jeweils noch einen random subkey drinter sind. Weil du den subkey nicht weißt musst du die wmi registry klasse in vbs nehmen nicht das regread das is alles

Die anderen funktionen verwenden WMI queries

sowas wie
Code:
Get-WmiObject -Namespace "root\CCM\Policy\Machine\ActualConfig" -ComputerName "localhost" -query "select * from CM_TaskSequence" | % {

wäre
Code:
Set objNMS = GetObject("winmgmts://./root/ccm/policy/machine/actualconfig")
Set objScheds = objNMS.ExecQuery("select * from CM_TaskSequence" )
dann kannst durch objScheds durchiterieren halt ganz normal
Code:
For Each objSched In objScheds
 blabla
next
alle diese sachen die da mit o.add und so gemacht werden sind halt blöd in vbs weils keine liste gibt und ein array verwenden vondem die größe nicht weißt nervt eher, ich würd das halt direkt ausgeben
Code:
$SMSCli = [wmiclass] "\root\ccm:SMS_Client"
ist
Code:
Set objNMS = GetObject("winmgmts://./root/ccm")
Set objSMSClient = objNMS.Get("SMS_Client")
damit solltest du dir eigentlich alles zusammenbasteln können, der rest ist imo ziemlich standard. Wenn du mir sagst was du ganz genau willst bzw wieso powershell nicht geht kann ich dir vielleicht auch ein wenig mehr helfen.

Falls es wirkl nur darum geht informationen abzurufen oder reruns zu starten kann ich nur nochmal das sccm client center von roger zander empfehlen das kann eigentl alles was diese poershell scripte können bzw es gibt auch die "SCCM right click tools" die diese autorerun geschichten und so direkt in die konsole einbauen, die kannst dir auch runterladen die sind in vbs geschrieben da fidnest du den kompletten code zu einigen deiner methoden denk ich
 
Hallo Syberdoor,

danke erstmal für deine Mühe und die ausführliche Antwort! :) Hast mir damit auf jeden Fall bereits sehr geholfen.
Die von dir genannten Tools kenne ich alle und nutze ich auch gerne, im konkreten Fall bringen sie aber leider nichts.
Es geht darum, dass für die Verteilung ein Wrapper genutzt wird, welcher bereits in vbs geschrieben ist und der nun erweitert und optimiert werden soll. Daher würde ich gerne die benötigten Funktionen in vbs integrieren und nicht, wie es derzeit geschieht die ps1 aus der vbs aufrufen und nur die Rückgabe verarbeiten. Generell sollen ps1. Skripte im vorliegenden Fall aus Sicherheitsgründen komplett deaktiviert werden, weswegen auch eine (aus meiner Sicht sinnvollere) Migration des gesamten Wrapper hin zu powershell leider nicht in Frage kommt.

Mfg Kae
 
Zurück
Oben