Sunday, July 17, 2022

Utility Powershell and Dos Commands: Save Output and Commands to file, Get Versions, Get Folder, Update Common Packages

 ###########################  
 # Write output and commands to text file DOS and PS  
 #########################  
 REM Check Version of spfx related packages and save to a file  
 node --version >> C:\temp\Logs\cmdPrompt.log  
 npm --version >> C:\temp\Logs\cmdPrompt.log  
 pnp --version >> C:\temp\Logs\cmdPrompt.log  
 yo --version >> C:\temp\Logs\cmdPrompt.log  
 gulp -v >> C:\temp\Logs\cmdPrompt.log  
 nvm ls >> C:\temp\Logs\cmdPrompt.log  
 choco --version >> C:\temp\Logs\cmdPrompt.log  
 type C:\temp\Logs\cmdPrompt.log   
 REM save command output to a file and command error output STDERR and STDOUT  
 choco --version 1>> C:\temp\Logs\cmdPrompt.log 2>&1   
 REM View file in cmd  
 type C:\temp\Logs\cmdPrompt.log   
 REM Save commands to append to a file  
 doskey /history >> C:\temp\Logs\cmdPrompt.Commands.log  
 REM Copy the Command Output to Windows Clipboard  
 REM ould copy the details of your network connections to the clipboard:  
 ipconfig /all | clip  
 REM opy the contents of a folder to the clipboard  
 dir | clip  
 # Powershell save commands + output  
 # ps output to a file, output to a text file with PowerShell on Windows 11 or Windows 10,   
 ipconfig | Out-File -FilePath C:\temp\Logs\cmdPrompt.log  
 #view the saved output on the screen  
 Gt-Content -Path C:\temp\Logs\cmdPrompt.log  
 # saving BOTH the commands you type AND all their output? I'm not talking about piping the output of any one to a file, like above. Instead, this is about the PowerShell Start-Transcript cmdlet. Try it out some time:  
 Start-Transcript  
 # Without any parameters, the transcript will be saved in the user’s documents folder, filename will automatically be generated and consists of the device name, random characters  
 #e.g:   
 # c:\users\name\documents\PowerShell_transcript.DEVICENAME.qp9EOTN2.20220301132612.txt  
 # Start recording  
 Start-Transcript  
 # stop recording  
 Stop-Transcript  
 # start options  
 # Append to a log file.  
 Start-Transcript -Path C:\temp\Logs\cmdPrompt.log -Append  
 #use -NoClobber prevent overwriting file  
 Start-Transcript -Path C:\temp\Logs\cmdPrompt.log -NoClobber  
 # -OutputDirectory parameter. This way we can specify the directory where we want to store the log file  
 Start-Transcript -OutputDirectory C:\Temp\Logs  
 # Result:  
 Transcript started, output file is C:\Temp\Logs\PowerShell_transcript.WIN11-LAB02.uftVAXsv.20220301045218.txt  
 # limit the header information to only a timestamp o  
 Start-Transcript -OutputDirectory C:\Temp\Logs -UseMinimalDeader  
 # E.g:  
 **********************  
 PowerShell transcript start  
 Start time: 20220301135543  
 **********************  
 # See also: https://itluke.online/2019/03/24/what-is-captured-with-powershell-transcripts/ for Verbose+Debug levels  
 # See also: https://4sysops.com/archives/powershell-transcript-record-a-session-to-a-text-file/  
 ###########################  
 # Get Versions  
 #########################  
 # PS get version of Spfx imprtant packages  
 node --version   
 npm --version   
 pnp --version   
 yo --version   
 gulp -v   
 nvm ls   
 choco --version   
 winget --version  
 # get version of Powershell  
 host  
 # or  
 $PSVersionTable  
 $PSVersionTable.PSVersion  
 # get the value of the PowerShellVersion parameter in the registry key   
 (Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion  
 #Version of PowerShell on Remote Computers  
 Invoke-Command -ComputerName 192.168.1.15 -ScriptBlock {$PSVersionTable.PSVersion} -Credential $cred  
 # get version of .Net + .Net Core  
 # versions of the .NET SDK are currently installed with a terminal  
 dotnet --list-sdks  
 (dir (Get-Command dotnet).Path.Replace('dotnet.exe', 'sdk')).Name  
 # which versions of the .NET runtime   
 dotnet --list-runtimes  
 (dir (Get-Command dotnet).Path.Replace('dotnet.exe', 'shared\Microsoft.NETCore.App')).Name  
 # dotnet core installed runtimes and SDKs, as well as some other info:  
 dotnet --info  
 # .NET Framework   
 # get from https://github.com/jmalarcon/DotNetVersions/releases save to C:\Windows\System32 or PATH  
 dotnetversions -b  
 # security updates and hotfixes that are installed on a computer using PowerShell:  
 $DotNetVersions = Get-ChildItem HKLM:\SOFTWARE\WOW6432Node\Microsoft\Updates | Where-Object {$_.name -like  
  "*.NET Framework*"}  
 ForEach($Version in $DotNetVersions){  
   $Updates = Get-ChildItem $Version.PSPath  
   $Version.PSChildName  
   ForEach ($Update in $Updates){  
     $Update.PSChildName  
     }  
 }  
 # Get CLR versions  
 # displays all the versions of the CLR installed on the computer. dl Clrver.exe (CLR Version Tool)  
 clrver   
 # get version of VS Code / Visual Studio   
 code --version  
 nuget help | select -First 1  
 dotnet nuget --version  
 # change based on version to be checked  
 (Get-Item "${env:ProgramFiles(x86)}\Microsoft Visual Studio 11.0\common7\ide\devenv.exe").VersionInfo.ProductVersion  
 # get paths to GAC  
 gacutil.exe -l  
 # get version of PnP  
 # get version of Spfx  
 REM DOS Get   
 Version of spfx related packages and save to a file  
 node --version >> C:\temp\Logs\cmdPrompt.log  
 npm --version >> C:\temp\Logs\cmdPrompt.log  
 pnp --version >> C:\temp\Logs\cmdPrompt.log  
 yo --version >> C:\temp\Logs\cmdPrompt.log  
 gulp -v >> C:\temp\Logs\cmdPrompt.log  
 nvm ls >> C:\temp\Logs\cmdPrompt.log  
 choco --version >> C:\temp\Logs\cmdPrompt.log  
 type C:\temp\Logs\cmdPrompt.log   
 ###########################  
 # Get Install Folders  
 #########################  
 # get install location of powershell  
 ###########################  
 # Update ps, choco,   
 #########################  
 #update ps core  
 iex "& { $(irm https://aka.ms/install-powershell.ps1) } -UseMSI"  
 # or   
 winget install PowerShell  

Thursday, July 7, 2022

Convert Gif to MP4 via ffmpeg

The below command can be used to convert a GIF to an MP4 using the pre-requsite ffmpeg app on Windows:


1. Open notepad, create a bat file : e.g: "fmpg.bat" 

2. Add the following : replace paths as needed:

 cd [PathToFFMpeg]\FFMpeg\bin

echo fn %~n1

echo INFILE- %1

echo OUTFILE- [PathOutput]\%~n1.mp4

ffmpeg -i "%1" -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" [PathOutput]\%~n1.mp4


Usage:

fmpg "C:\MyGifs\1.gif"

Example:

Tuesday, May 17, 2022

Azure Microsoft Graph Explorer Permissions : How to resolve "Application must have one of the following scopes" Error

 Symptoms: 

When using the MS Graph Explorer in Azure: 

If you recie b an eeor with the follwing substring text in the error message:

"Application is not authorized to perform this operation. Application must have one of the following scopes:"

For example:

Url:https://graph.microsoft.com/beta/deviceManagement


Response:

 {

    "error": {
        "code": "Forbidden",
        "message": "{\r\n  \"_version\": 3,\r\n  \"Message\": \"Application is not authorized to perform this operation. Application must have one of the following scopes: DeviceManagementConfiguration.Read.All, DeviceManagementConfiguration.ReadWrite.All - Operation ID (for customer support): 00000000-0000-0000-0000-000000000000 - Activity ID: 5c977c7f-ae03-4be0-82c2-408eafb65caf - Url: <https://fef.msub05.manage.microsoft.com/DeviceConfiguration_1911/StatelessDeviceConfigurationFEService/deviceManagement?api-version=5019-09-20>\",\r\n  \"CustomApiErrorPhrase\": \"\",\r\n  \"RetryAfter\": null,\r\n  \"ErrorSourceService\": \"\",\r\n  \"HttpHeaders\": \"{}\"\r\n}",
        "innerError": {
            "request-id": "5c977c7f-ae03-4be0-82c2-408eafb65caf",
            "date": "2019-11-15T18:53:00"
        }
    }
}

Resolution:

  1. Sign in to the Azure portal, go to Azure Active Directory > Enterprise Applications, and then select Graph explorer from the list of applications. For example for me : Enterprise Application is at this url 



  2. Click "Graph Explorer"

  3. Click Permissions



  4. Search for, Add and then Grant the permission that we want Graph Explorer to execute without error:



  5. With our permission added, we can now execute without error:

  6. Execute:



Sunday, May 1, 2022

Get Powershell Version : various methods to get the version of Powershell

 There are numerous ways to do the same thing in Powershell. In this post, we will go over every way to check the PowerShell version.  All these ways should work in both Windows PowerShell and PowerShell Core. 


Here are the ways to get the version of PowerShell :

  • The $host.Version property
  • The (Get-Host).Version property
  • The $PSVersionTable.PSVersion property
  • The registry (Windows PowerShell only)

Another method is getting the Powershell version from a remote computer:

Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {Get-Host} -Credential $cred

results in for example:

Major Minor Build Revision PSComputerName ----- ----- ----- -------- -------------- 1 0 0 0 10.0.0.5


Using $host and Get-Host  command

: Referencing $host.Version is another way to check Powershell version. The $host variable is an automatic variable that returns the same output as Get-Host.



























$host.Version on Remote Computers

You will see the same behavior via PowerShell Remoting with $host.Version as you will running Get-Host.

Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {$host.Version} -Credential $cred


Registry

If you don’t want to open up PowerShell itself, you can also check the registry. The version of PowerShell is tucked away under a value in the registry key path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine. This registry key has a value called PowerShellVersion that you can reference by using Get-ItemProperty.

(Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion 5.1.17134.1

Also WMI:

reg query HKLM\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine /v PowerShellVersion HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine PowerShellVersion REG_SZ 5.1.17134.1


Registry on a remote computer:

$scriptBlock = { [version](Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion } PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock $scriptBlock -Credential $cred


 Version via $PSVersionTable.

PSVersion property on the $PSVersionTable automatic variable. This method will always represent the PowerShell engine.