====== Skriptejä softajakelun avuksi ====== Tänne on kerätty skriptejä, joista on todettu olevan hyötyä softajakelun yhteydessä. ==== Onko koneelle kirjautunut käyttäjä domain-käyttäjä ==== Seuraava VBScript-koodinpätkä hakee koneelle kirjautuneen käyttäjän tiedot ympäristömuuttujista ja tarkistaa onko käyttäjä domain-tunnus vaiko ei. Set objShell = CreateObject("WScript.Shell") Set objProcEnv = objShell.Environment("Process") strUserName = objProcEnv("USERNAME") strUserDomain = objProcEnv("USERDOMAIN") strUserDNSDomain = objProcEnv("USERDNSDOMAIN") If strUserDNSDomain <> "UTU.FI" Then strValue = "Koneelle kirjautunut käyttäjä " & VbCrLf & VbCrLf & strUserDomain & "\" & strUserName & VbCrLf & VbCrLf & "ei ole utu-domainkäyttäjä." answer = MsgBox(strValue, vbOKOnly + vbCritical + vbSystemModal, "Huomio!") WScript.Quit ' palautetaan -10, jos ei ole utu-domainin käyttäjä ==== Onko prosessi käynnissä ==== VBSkript-funktio, joka käyttää WMI-rajapintaa selvittämään onko koneella tietyn niminen prosessi käynnissä. Function isProcessRunning(strIn) Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & strIn & "'") If colProcesses.Count > 0 Then isProcessRunning = True Else isProcessRunning = False End If End Function ==== x86 vaiko x64 ==== Seuraavalla VBScript-funktiolla saat selville käyttöjärjestelmän bittisyyden riippumatta siitä ajetaanko skripti aidosti 32-bittisessä Windowsissa, 32-bittisessä ympäristössä aidosti 64-bittisessä Windowsissa vaiko 64-bittisessä ympäristössä aidosti 64-bittisessä Windowsissa. ' Finds out Real Operating System architecture (despite the running process image type) ' Returns: 0: OS architecture not found (or propably Intel Itanium) ' 32: for 32-bit OS (x86) ' 64: for 64-bit OS and 32-bit process on 64-bit OS (AMD64) Function GetOSArchitecture Dim objProcEnv Set objProcEnv = objShell.Environment("Process") Select Case objProcEnv("PROCESSOR_ARCHITECTURE") Case "x86" Select Case objProcEnv("PROCESSOR_ARCHITEW6432") Case "" GetOSArchitecture = 32 Case "AMD64" GetOSArchitecture = 64 Case Else GetOSArchitecture = 0 End Select Case "AMD64" GetOSArchitecture = 64 Case Else GetOSArchitecture = 0 End Select End Function ==== x64 - registryn käsittely ==== Seuraavat VBScript-funktiot (**EnumRegKey**, **ReadRegStr**, **CreateRegKey**, **CreateRegStringValue**) mahdollistavat registryn Key ja REG_SZ -arvojen käsittelyn WoW64-rajapinnan ohi. ' --- Enumerates registry keys from the local computer's registry using WMI. ' Parameters: ' RootKey - The registry hive (see http://msdn.microsoft.com/en-us/library/aa390788(VS.85).aspx for a list of possible values). ' Key - The key to be enumerated. ' RegType - The registry bitness: 32 or 64. ' Returns: ' Null if Key was not found, otherwise Variable Array with Keys as strings Function EnumRegKey (RootKey, Key, RegType) Dim objCtx, objLocator, objReg, objInParams, objOutParams Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet") objCtx.Add "__ProviderArchitecture", RegType objCtx.Add "__RequiredArchitecture", TRUE Set objLocator = CreateObject("Wbemscripting.SWbemLocator") Set objReg = objLocator.ConnectServer("", "root\default", "", "", , , , objCtx).Get("StdRegProv") Set objInParams = objReg.Methods_("EnumKey").InParameters objInParams.hDefKey = RootKey objInParams.sSubKeyName = Key Set objOutParams = objReg.ExecMethod_("EnumKey", objInParams, , objCtx) EnumRegKey = objOutParams.sNames End Function ' --- Reads a REG_SZ value from the local computer's registry using WMI. ' Parameters: ' RootKey - The registry hive (see http://msdn.microsoft.com/en-us/library/aa390788(VS.85).aspx for a list of possible values). ' Key - The key that contains the desired value. ' Value - The value that you want to get. ' RegType - The registry bitness: 32 or 64. ' Returns: ' Null if Key was not found, otherwise Value as a string Function ReadRegStr (RootKey, Key, Value, RegType) Dim objCtx, objLocator, objReg, objInParams, objOutParams Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet") objCtx.Add "__ProviderArchitecture", RegType objCtx.Add "__RequiredArchitecture", TRUE Set objLocator = CreateObject("Wbemscripting.SWbemLocator") Set objReg = objLocator.ConnectServer("", "root\default", "", "", , , , objCtx).Get("StdRegProv") Set objInParams = objReg.Methods_("GetStringValue").InParameters objInParams.hDefKey = RootKey objInParams.sSubKeyName = Key objInParams.sValueName = Value Set objOutParams = objReg.ExecMethod_("GetStringValue", objInParams, , objCtx) ReadRegStr = objOutParams.sValue End Function ' --- Creates registry key to the local computer's registry using WMI. ' Parameters: ' RootKey - The registry hive (see http://msdn.microsoft.com/en-us/library/aa390788(VS.85).aspx for a list of possible values). ' Key - The key to be created. ' RegType - The registry bitness: 32 or 64. ' Returns: ' Nothing Function CreateRegKey (RootKey, Key, RegType) Dim objCtx, objLocator, objReg, objInParams Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet") objCtx.Add "__ProviderArchitecture", RegType objCtx.Add "__RequiredArchitecture", TRUE Set objLocator = CreateObject("Wbemscripting.SWbemLocator") Set objReg = objLocator.ConnectServer("", "root\default", "", "", , , , objCtx).Get("StdRegProv") Set objInParams = objReg.Methods_("CreateKey").InParameters objInParams.hDefKey = RootKey objInParams.sSubKeyName = Key objReg.ExecMethod_ "CreateKey", objInParams, , objCtx End Function ' --- Creates a REG_SZ type registry Key on value to the local computer's registry using WMI. ' Parameters: ' RootKey - The registry hive (see http://msdn.microsoft.com/en-us/library/aa390788(VS.85).aspx for a list of possible values). ' Key - The REG_SZ Key Name to be created. ' Name - Name on the regisry entry ' Value - Value ' RegType - The registry bitness: 32 or 64. ' Returns: ' Nothing Function CreateRegStringValue (RootKey, Key, Name, Value, RegType) Dim objCtx, objLocator, objReg, objInParams Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet") objCtx.Add "__ProviderArchitecture", RegType objCtx.Add "__RequiredArchitecture", TRUE Set objLocator = CreateObject("Wbemscripting.SWbemLocator") Set objReg = objLocator.ConnectServer("", "root\default", "", "", , , , objCtx).Get("StdRegProv") Set objInParams = objReg.Methods_("SetStringValue").InParameters objInParams.hDefKey = RootKey objInParams.sSubKeyName = Key objInParams.sValueName = Name objInParams.sValue = Value objReg.ExecMethod_ "SetStringValue", objInParams, , objCtx End Function ==== Onko ohjelman tietty versio asennettuna? ==== Option Explicit Dim oShell Dim regPath Dim version Set oShell = CreateObject("Wscript.Shell") Select Case GetOSArchitecture Case 32 ' x86 RegPath = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F83216035FF}\DisplayVersion" Case Else ' x64 RegPath = "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F83216035FF}\DisplayVersion" End Select On Error Resume Next version = oShell.RegRead(RegPath) On Error Goto 0 If version = "6.0.350" Then wScript.Echo("Asennettuna") End If wScript.Quit ==== Luo package ja programsit Configuration Manageriin ==== #Set the program to be run only on x64 systems. Function SetOperatingSystemsx64 { $Program = $Args[0] $OSystemsx64 = @(@("6.10.9999.9999","6.10.0000.0"),` @("6.20.9999.9999","6.20.0000.0"),` @("6.30.9999.9999","6.30.0000.0"),` @("5.20.9999.9999","5.20.0000.0"),` @("5.20.3790.2","5.20.3790.0"),` @("6.00.9999.9999","6.00.0000.1"),` @("6.10.9999.9998","6.10.0000.0"),` @("6.30.9999.9998","6.30.0000.0"),` @("6.20.9999.9998","6.20.0000.0"),` @("6.00.9999.9999","6.00.0000.0"),` @("5.20.9999.9999","5.20.3790.0"),` @("10.00.9999.9999","10.00.0000.0")) $OS_Details = @() ForEach ($Plat in $OSystemsx64) { $NewOS = ([wmiclass]"\\configmgr.utu.fi\root\sms\site_TUY:SMS_OS_Details").CreateInstance() $NewOS.MaxVersion = $Plat[0] $NewOS.MinVersion = $Plat[1] $NewOS.Name = "Win NT" $NewOS.PlatForm = "x64" $NewOS *>$Null $OS_Details = $OS_Details + $NewOS } $Program.Get() $Program.SupportedOperatingSystems = $OS_Details $Program.Put() } #Set the program to be run only on x86 systems. Function SetOperatingSystemsx86 { $Program = $Args[0] $OSystemsx86 = @(@("6.10.9999.9999","6.10.0000.0"),` @("6.20.9999.9999","6.20.0000.0"),` @("6.30.9999.9999","6.30.0000.0"),` @("5.20.9999.9999","5.20.0000.0"),` @("5.20.3790.2","5.20.3790.0"),` @("6.00.9999.9999","6.00.0000.1"),` @("6.00.9999.9999","6.00.0000.0"),` @("5.10.9999.9999","5.10.0000.0"),` @("10.00.9999.9999","10.00.0000.0")) $OS_Details = @() ForEach ($Plat in $OSystemsx86) { $NewOS = ([wmiclass]"\\configmgr.utu.fi\root\sms\site_TUY:SMS_OS_Details").CreateInstance() $NewOS.MaxVersion = $Plat[0] $NewOS.MinVersion = $Plat[1] $NewOS.Name = "Win NT" $NewOS.PlatForm = "I386" $NewOS *>$Null $OS_Details = $OS_Details + $NewOS } $Program.Get() $Program.SupportedOperatingSystems = $OS_Details $Program.Put() } Function CreateProgram { If(!(Get-Module ConfigurationManager)) {Import-Module "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager"} cd TUY: New-CMProgram ` -PackageName $Args[0].Name ` -StandardProgramName $Args[1].Name ` -CommandLine $Args[1].CommandLine ` -DiskSpaceRequirement $Args[1].DiskSpace ` -DiskSpaceUnit $Args[1].DiskSpaceUnit ` -ProgramRunType $Args[1].RunType ` -Duration $Args[1].RunTime ` -RunMode $Args[1].RunMode ` -UserInterAction ([System.Convert]::ToBoolean($Args[1].UserInteraction)) *>$Null $CMProgram = Get-CMProgram -PackageId $Args[0].PackageId -ProgramName $Args[1].Name Switch ($Args[1].Bitness) {"x64" {$CMProgram.ProgramFlags = $CMProgram.ProgramFlags -bxor ([math]::pow(2,27)); $CMProgram.Put(); SetOperatingSystemsx64 $CMProgram } "x86" {$CMProgram.ProgramFlags = $CMProgram.ProgramFlags -bxor ([math]::pow(2,27)); $CMProgram.Put(); SetOperatingSystemsx86 $CMProgram } } If ($Args[1].RunAnotherProgram.Length -gt 0) {$CMProgram.DependentProgram = $Args[0].PackageId + ";;" +$Args[1].RunAnotherProgram;$CMProgram.Put();$CMProgram.ProgramFlags = $CMProgram.ProgramFlags -bxor ([math]::pow(2,7));$CMProgram.Put()} #There is no argument for Comment in New-CMProgram so we have to add the Comment with Set-CMProgram. Set-CMProgram ` -StandardProgram ` -InputObject $Args[0] ` -StandardProgramName $Args[1].Name ` -Comment $Args[1].Comment *>$Null cd c: } #Main If ($args.Length -eq 0) {Write-Host "No software given!";Exit} #Read the package settings from PackageDetails.csv, {Name,Language,Manufacturer,Path,Version,DistributeContent}. All other are strings, DistributeContent is Boolean. #Add Date to the name to randomize the package name. $PackageDetails = Import-Csv $args[0] $Date = Get-Date -Format d $PackageName = $PackageDetails.Name + ".$Date" $PaLang = $PackageDetails.Language $PaManufacturer = $PackageDetails.Manufacturer $PaPath = $PackageDetails.Path $PaVersion = $PackageDetails.Version #Load the module ConfigurationManager and change to the ConfigMgr site. If(!(Get-Module ConfigurationManager)) {Import-Module "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager"} cd TUY: #Create the package. New-CMPackage ` -Name $PackageName ` -Language $Palang ` -Manufacturer $PaManufacturer ` -Path $PaPath ` -Version $PaVersion *>$Null #Move the package to the right folder. $NewCMPackage = Get-CMPackage -Name $PackageName Move-CMObject -FolderPath "TUY:\Package\Test" -InputObject $NewCMPackage #Distribute the content if needed. If($PackageDetails.DistributeContent = "True") {Start-CMContentDistribution -Package $NewCMPackage -DistributionPointName configmgrdp.utu.fi} cd c: #Import programs from the Programs.csv, {Name,CommandLine,Comment,DiskSpace,DiskSpaceUnit,RunType,Runtime,UserInteraction,RunMode,Bitness,RunAnotherProgram} and create each program. $Programs = Import-Csv $args[1] ForEach ($Program in $Programs) {CreateProgram $NewCMPackage $Program} cd TUY: #Rename the package. Set-CMPackage ` -InputObject $NewCMPackage ` -NewName $PackageDetails.Name *>$Null cd c: FirefoxPackageDetails.csv: Name,Language,Manufacturer,Path,Version,DistributeContent\\ "Firefox","EN","Mozilla","\\utu.fi\verkkolevyt\Managed Applications\Mozilla Firefox\Mozilla Firefox 38.2.1 esr","38.2.2 ESR","True" FirefoxPrograms.csv: Name,CommandLine,Comment,DiskSpace,DiskSpaceUnit,RunType,Runtime,UserInteraction,RunMode,Bitness,RunAnotherProgram\\ "Install, Uninstall (Machine)","wscript.exe runsoftware.vbs","Use this program to Install or Uninstall the machine part of the application.","80","1","0","30","True","1","x86",""\\ "Install, Uninstall","wscript.exe profile.vbs","Use this program to Install or Uninstall the application.","80","1","0","30","True","0","x86","Install, Uninstall (Machine)"