Important Notice: On February 29th, this community was put into read-only mode. All existing posts will remain but customers are unable to add new posts or comment on existing. Please feel to join our Community Discord for any questions and discussions.

Use PDQ Deploy to push In-Place Windows 10 Upgrade

#How to use PDQ Deploy to push In-Place Windows 10 Upgrade

Others may have a slicker solution, but I needed any easy way to not only upgrade all workstations from Win7 and Win8.1, but to verify afterwards which computers succeeded and which failed. I will try to make this as basic as possible.

  1. Copy the entire contents of your Windows 10 ISO to a network share, such as "\\fileserver\Win10Setup"

  2. Create a PDQ Deploy package

  3. Add a "PowerShell" step called "Check Win Version" (paste the script below into the Details tab of this step

     <#
      .SYNOPSIS
      Windows 10 upgrade check
    
      .DESCRIPTION
      This is used the check the whether a computer is READY to upgrade to Windows 10
    
      written by Mike Resnick 06-14-2018
     #>
    
     $OS = gwmi -Class win32_operatingsystem
     If ($OS.version -match "10.")
     {
         # It is ALREADY Windows 10!
         # Let's send an exit code that PDQ will consider "bad"
         write-output "ERROR: Win version is ALREADY Windows 10: $($OS.version)"
         $host.SetShouldExit(111111111)
     }
     Else
     {
         # Win version is NOT currently Windows 10
         # Exit code should default to 0
         write-output "READY FOR UPGRADE: Win version is: $($OS.version)"
     }
    
  4. Add a "Command" step called "Setup.exe Upgrade". Use the following EXAMPLE (you need your own Product Key):

     start /wait \\fileserver\Win10Setup\setup.exe /auto upgrade /migratedrivers all /dynamicupdate enable /telemetry disable /compat IgnoreWarning /showoobe none /pkey XXXXX-XXXXX-XXXXX-XXXXX-XXXXX /NoReboot
    
  5. Add a "Reboot" step

  6. Add a "Sleep" step (I used 10 minutes, but you could do 10-20-30-40, whatever you like)

  7. Finally, add another "PowerShell" step to verify the Windows version and report back to PDQ. Copy and paste this script into this step:

     <#
      .SYNOPSIS
      Windows 10 upgrade check
    
      .DESCRIPTION
      This is used the check the whether a computer has COMPLETED upgrade to Windows 10
    
      written by Mike Resnick 06-14-2018
     #>
    
     $OS = gwmi -Class win32_operatingsystem
     If ($OS.version -match "10.")
     {
         # Great!
         # Exit code should default to 0
         write-output "SUCCESS: Win version is: $($OS.version)"
     }
     Else
     {
         # This is NOT Windows 10
         # Let's send an exit code that PDQ will consider "bad"
         write-output "ERROR: Win version is: $($OS.version)"
         $host.SetShouldExit(111111111)
     }
    

#What a deployment output looks like When you actually Deploy to a target:

For Successful deployments, if a Target upgraded to Windows 10, the package will report "Successful", and you can click the link under the "Steps" column of the Deployment details to see the reported version of Windows.

The final step "Output" should report something like:

    SUCCESS: Win version is: 10.0.17134

For FAILED deployments, if a Target FAILED to upgrade to Windows 10 for some reason, the package will report "Failed", and you can click the link under the "Steps" column of the Deployment details to see the reported version of Windows.

The final step "Output" may report something like:

    ERROR: Win version is: 6.3.9600

I hope this is helpful for at least one other person.

Good luck!

0

Comments

49 comments
Date Votes
  • I know this is an old thread, but the following XML has been working for me:

    <?xml version="1.0" encoding="utf-8"?>
    <AdminArsenal.Export Code="PDQDeploy" Name="PDQ Deploy" Version="19.3.30.0" MinimumVersion="15.0">
    <Package>
    <CurrentLibraryPackageVersionId value="null" />
    <PackageDefinition name="Definition">
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Bits64</Architecture>
    <Version>Windows81, Windows10</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <CopyMode>Default</CopyMode>
    <DelayedApprovalTimeSpan>7.00:00:00</DelayedApprovalTimeSpan>
    <DownloadApprovalMode>Manual</DownloadApprovalMode>
    <InventoryScanProfileId value="1" />
    <IsDownloadApprovalModeInherited value="true" />
    <ScanAfterDeployment value="true" />
    <Steps type="list">
    <RebootStep>
    <Message></Message>
    <ShutdownOnly value="false" />
    <Timeout value="1" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>IsMember</ConditionMode>
    <InventoryCollectionId value="1058" />
    <InventoryCollectionName>Reboot Required</InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>StopDeploymentFail</ErrorMode>
    <Title>Reboot</Title>
    <TypeName>Reboot</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </RebootStep>
    <CommandStep>
    <Command>net stop wuauserv</Command>
    <Files></Files>
    <SuccessCodes>0</SuccessCodes>
    <RunAs value="null" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>Continue</ErrorMode>
    <Title>Stop Windows Update</Title>
    <TypeName>Command</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </CommandStep>
    <CommandStep>
    <Command>net stop cryptSvc</Command>
    <Files></Files>
    <SuccessCodes>0</SuccessCodes>
    <RunAs value="null" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>Continue</ErrorMode>
    <Title>Stop Crypt Service</Title>
    <TypeName>Command</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </CommandStep>
    <CommandStep>
    <Command>net stop bits</Command>
    <Files></Files>
    <SuccessCodes>0</SuccessCodes>
    <RunAs value="null" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>Continue</ErrorMode>
    <Title>Stop BITS</Title>
    <TypeName>Command</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </CommandStep>
    <CommandStep>
    <Command>net stop msiserver</Command>
    <Files></Files>
    <SuccessCodes>0</SuccessCodes>
    <RunAs value="null" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>Continue</ErrorMode>
    <Title>Stop MSIEXEC</Title>
    <TypeName>Command</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </CommandStep>
    <CommandStep>
    <Command>rmdir /S /Q C:\Windows\SoftwareDistribution</Command>
    <Files></Files>
    <SuccessCodes>0</SuccessCodes>
    <RunAs value="null" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>Continue</ErrorMode>
    <Title>Delete SoftwareDistribution</Title>
    <TypeName>Command</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </CommandStep>
    <CommandStep>
    <Command>net start wuauserv</Command>
    <Files></Files>
    <SuccessCodes>0</SuccessCodes>
    <RunAs value="null" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>Continue</ErrorMode>
    <Title>Start Windows Update</Title>
    <TypeName>Command</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </CommandStep>
    <CommandStep>
    <Command>net start cryptSvc</Command>
    <Files></Files>
    <SuccessCodes>0</SuccessCodes>
    <RunAs value="null" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>Continue</ErrorMode>
    <Title>Start Crypt Service</Title>
    <TypeName>Command</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </CommandStep>
    <CommandStep>
    <Command>net start bits</Command>
    <Files></Files>
    <SuccessCodes>0</SuccessCodes>
    <RunAs value="null" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>Continue</ErrorMode>
    <Title>Start BITS</Title>
    <TypeName>Command</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </CommandStep>
    <CommandStep>
    <Command>net start msiserver</Command>
    <Files></Files>
    <SuccessCodes>0</SuccessCodes>
    <RunAs value="null" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>Continue</ErrorMode>
    <Title>Start MSIEXEC</Title>
    <TypeName>Command</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </CommandStep>
    <PowerShellStep>
    <CustomCommandLine></CustomCommandLine>
    <Files></Files>
    <Script>Disable-WindowsOptionalFeature -Online -FeatureName Printing-PrintToPDFServices-Features</Script>
    <SuccessCodes>0</SuccessCodes>
    <RunAs value="null" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>Continue</ErrorMode>
    <Title>Disable PrintToPDF</Title>
    <TypeName>PowerShell</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </PowerShellStep>
    <PowerShellStep>
    <CustomCommandLine></CustomCommandLine>
    <Files></Files>
    <Script>Disable-WindowsOptionalFeature -Online -FeatureName Printing-XPSServices-Features</Script>
    <SuccessCodes>0</SuccessCodes>
    <RunAs value="null" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>Continue</ErrorMode>
    <Title>Disable XPS</Title>
    <TypeName>PowerShell</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </PowerShellStep>
    <InstallStep>
    <CustomCommandLine></CustomCommandLine>
    <FileName>$(Repository)\Microsoft\20H2\setup.exe</FileName>
    <Files></Files>
    <IncludeDirectory value="true" />
    <LeaveInstallFile value="false" />
    <MsiOperation>Install</MsiOperation>
    <MsiQuiet value="true" />
    <MsiRestart>Never</MsiRestart>
    <Parameters>/auto Upgrade /quiet /Compat IgnoreWarning /showoobe none /DynamicUpdate Disable /Telemetry Disable /MigrateDrivers All</Parameters>
    <SuccessCodes>0,1641,3010,2359302</SuccessCodes>
    <RunAs value="null" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>StopDeploymentFail</ErrorMode>
    <Title>Perform Upgrade</Title>
    <TypeName>Install</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </InstallStep>
    <SleepStep>
    <Seconds value="3600" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>StopDeploymentFail</ErrorMode>
    <Title>Sleep</Title>
    <TypeName>Sleep</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </SleepStep>
    <RebootStep>
    <Message></Message>
    <ShutdownOnly value="false" />
    <Timeout value="1" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>Continue</ErrorMode>
    <Title>Reboot</Title>
    <TypeName>Reboot</TypeName>
    <IsEnabled value="false" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </RebootStep>
    <PowerShellStep>
    <CustomCommandLine></CustomCommandLine>
    <Files></Files>
    <Script>Enable-WindowsOptionalFeature -Online -FeatureName Printing-PrintToPDFServices-Features -NoRestart
    </Script>
    <SuccessCodes>0</SuccessCodes>
    <RunAs value="null" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>StopDeploymentFail</ErrorMode>
    <Title>Restore Print to PDF</Title>
    <TypeName>PowerShell</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </PowerShellStep>
    <PowerShellStep>
    <CustomCommandLine></CustomCommandLine>
    <Files></Files>
    <Script>Enable-WindowsOptionalFeature -Online -FeatureName Printing-XPSServices-Features -NoRestart</Script>
    <SuccessCodes>0</SuccessCodes>
    <RunAs value="null" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>StopDeploymentFail</ErrorMode>
    <Title>Restore XPS</Title>
    <TypeName>PowerShell</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </PowerShellStep>
    </Steps>
    <Timeout value="240" />
    <UseCustomTimeout value="true" />
    <RunAs value="null" />
    </PackageDefinition>
    <Description></Description>
    <NewLibraryPackageVersionId value="null" />
    <OriginalId value="null" />
    <Version></Version>
    <IsAutoDownload value="false" />
    <FolderId value="1" />
    <LibraryPackageVersionId value="null" />
    <Name>20H2 Update</Name>
    <Path>Packages\20H2 Update</Path>
    <PackageDisplaySettings name="DisplaySettings">
    <DisplayType>Normal</DisplayType>
    <IconKey>Icon-Package</IconKey>
    <SortOrder value="7" />
    </PackageDisplaySettings>
    </Package>
    </AdminArsenal.Export>

    1
  • how do you use this xml in PDQ

    0
  • Copy the XML code I pasted into a txt document and save it with an xml extension.  Then, import it into PDQ Deploy.  

    The first reboot step is linked to a PDQ collection for Reboot Required.  You'll probably need to relink that.

    0
  • wow thanks learn something new today :)

    0
  • Let me know if you have any questions!

    0
  • kercherm

    I realise this is an old post, but just gave your script a go and it worked a treat, thanks for supplying this...

    The only thing that caught me out is that after the install of the update ( I'm testing this on 21H1 ) the device just reboots no warning etc... have you found a way to stop this? I'm not sure how it can work without the reboot as it restarts a couple times .. just trying to get it 100% User free so that the user wont even know the updates been installed except a little slowness when the files are copied etc...

    Anyone know a way to do this..? was thinking of adding the /noreboot switch would this work?

    Thanks,

    Mick.

    0
  • This is what my package looks like today:

    The first reboot step is linked to a PDQ Collection for Reboot required as the upgrade process won't run if there's a pending reboot.  I don't know if there's a way to suppress the required reboots since they're part of the process.  Personally, I'd rather perform these updates outside of business hours and let my users wake up to a fresh OS.  If you were to depend on the user to reboot on their schedule, they would be sitting there waiting for a hour or more.

    I disabled the reboot in step 15 because I think it was redundant. 

     

    0
  • Thanks for your quick response. I see where you're coming from regarding letting the process take care of the reboot out of hours, the issue I have is our company is trying to be as 'green' as possible so all users are encouraged to shut their PC's down at the end of each day... but I suppose when new feature releases are due for install I could get the users to leave their machines on over night...

    Regarding the security updates, do you just use the PDQ default packages or again create your own? I'm only just starting out with PDQ so trying to get as much info as possible before making the decision to purchase or not.

    Mick.

    0
  • We actually still use SCCM for updates (not my choice), but it is what it is.  I would have no problem using PDQ to push those as well.  I use DFS for my Repository so machines always pull their updates from a local server.  If you're on the fence about buying, I'd say make the jump!  I've been using these products for years and couldn't imagine my job without them!

    0
  • Mick Duffin

    If it's helpful and if you are just looking for a NoReboot, in-place upgrade, here's our package that I made.

    We use it for the systems that can't reboot during the day. It's silent in the background. Basically just a single command line to your share of the Windows setup files with a "/NoReboot" parameter at the end, like this:

    start /wait \\YourServer\21H1\setup.exe /auto upgrade /migratedrivers all /dynamicupdate enable /telemetry disable /compat IgnoreWarning /showoobe none /pkey XXXXX-XXXXX-XXXXX-XXXXX-XXXXX /NoReboot

    Oh, and don't forget to set the timeout value to something really high (we use 480 minutes) to make sure a slower computer doesn't timeout on an upgrade.

    Here's the XML if you want it, but you could probably just make your own package:

    Good luck!

    BEGIN===================

    <?xml version="1.0" encoding="utf-8"?>
    <AdminArsenal.Export Code="PDQDeploy" Name="PDQ Deploy" Version="19.3.48.0" MinimumVersion="15.0">
    <Package>
    <CurrentLibraryPackageVersionId value="null" />
    <PackageDefinition name="Definition">
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Bits64</Architecture>
    <Version>Windows10</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <CopyMode>Default</CopyMode>
    <DelayedApprovalTimeSpan>7.00:00:00</DelayedApprovalTimeSpan>
    <DownloadApprovalMode>Manual</DownloadApprovalMode>
    <InventoryScanProfileId value="3" />
    <IsDownloadApprovalModeInherited value="true" />
    <ScanAfterDeployment value="false" />
    <Steps type="list">
    <CommandStep>
    <Command>start /wait \\YourServer\Win10-21H1\setup.exe /auto upgrade /migratedrivers all /dynamicupdate enable /telemetry disable /compat IgnoreWarning /showoobe none /pkey XXXXX-XXXXX-XXXXX-XXXXX-XXXXX /NoReboot</Command>
    <Files></Files>
    <SuccessCodes>0</SuccessCodes>
    <RunAs value="null" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>StopDeploymentFail</ErrorMode>
    <Title>Batch Setup.exe Upgrade</Title>
    <TypeName>Command</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </CommandStep>
    </Steps>
    <Timeout value="480" />
    <UseCustomTimeout value="true" />
    <RunAs value="null" />
    <OfflineStatus name="OfflineStatus">
    <IsInherited value="false" />
    <TryWol value="false" />
    <UsePing value="false" />
    </OfflineStatus>
    </PackageDefinition>
    <Description>Performs an In-Place Upgrade to Windows 10 Enterprise, but does NOT reboot</Description>
    <NewLibraryPackageVersionId value="null" />
    <OriginalId value="null" />
    <Version></Version>
    <IsAutoDownload value="false" />
    <FolderId value="1" />
    <LibraryPackageVersionId value="null" />
    <Name>CHS - Win 10 - 21H1 - In-Place Upgrade - NO REBOOT</Name>
    <Path>Packages\CHS - Win 10 - 21H1 - In-Place Upgrade - NO REBOOT</Path>
    <PackageDisplaySettings name="DisplaySettings">
    <DisplayType>Normal</DisplayType>
    <IconKey>Icon-Package</IconKey>
    <SortOrder value="235" />
    </PackageDisplaySettings>
    </Package>
    </AdminArsenal.Export>

    END====================

     

    -Mike

     

    0
  • Mike Resnick

    Thanks for your reply, I'll give this a try also, but I've been toying with the idea of using wake on lan for PC's over night... then install the upgrade then after the update is installed shut the machine down again.... In theory this should work but will need to test it on a few PC's first... I'll need to enable WOL on the pc's also... but its worth a try.

    Thanks again.

    Mick.

    0
  • Mick Duffin

    We also do WOL to wake computers overnight for all sorts of deployments and activities. If you want, I have a package you can use for configuring the Windows side of WOL. And if you use Dell workstations, by chance, I have a Dell BIOS config package that sets the correct power states in the BIOS to still accept WOL packets in a power-down mode. Just let me know if you would like any of it. Happy to share.

    And as kercherm said, pay and get PDQ Deploy and Inventory! Had it for years also. It's a total game changer. I can't even tell you how much personnel time and effort it has saved us. We also use SCCM for all Microsoft updates, but PDQ takes care of everything else. So awesome.

    0
  • Mike Resnick

    Yes please any info / help you can give would be much appreciated. I need to get the expenditure past our FD but I'm going to push for Deploy and Inventory... even in this short time I've been using it, its helped out so got to be worth it.

    We are majority HP workstations with a few Lenovo, is there a package for these? or is it just a case of creating your own? 

    Thanks,

    Mick.

    0
  • Mike Resnick  I'd be interested in those packages as well.  We are 100% remote right now, but I'd like to tinker with the WOL at some point.

    0
  • Mick Duffin and kercherm

    For the Dell BIOS config for WOL:

    First, you need to download Dell Command Configure and create an EXE package of the BIOS settings. I'll explain a bit. Their GUI makes this easy.

    Here's the entirety of the Dell Command Configure file you will IMPORT into the Dell Command Configure Wizard. BE SURE to save it as a ".cctk" file.

    [cctk]
    AcPwrRcvry=Off
    Aspm=Auto
    BlockSleep=Disabled
    CStatesCtrl=Enabled
    DeepSleepCtrl=Disabled
    WakeOnLan=LanOnly

     

    Then, after you import that, just export the EXE it will create for you. Then, just make a super basic PDQ package to deploy that EXE. It doesn't require ANY switches. Just the path to the EXE and deploy it as the Deploy User account.

    For the Windows settings that need to be set, here is the PDQ package XML:

    BEGIN XML ====================================================

    <?xml version="1.0" encoding="utf-8"?>
    <AdminArsenal.Export Code="PDQDeploy" Name="PDQ Deploy" Version="19.3.48.0" MinimumVersion="15.0">
    <Package>
    <CurrentLibraryPackageVersionId value="null" />
    <PackageDefinition name="Definition">
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <CopyMode>Default</CopyMode>
    <DelayedApprovalTimeSpan>7.00:00:00</DelayedApprovalTimeSpan>
    <DownloadApprovalMode>Manual</DownloadApprovalMode>
    <InventoryScanProfileId value="null" />
    <IsDownloadApprovalModeInherited value="true" />
    <ScanAfterDeployment value="null" />
    <Steps type="list">
    <PowerShellStep>
    <CustomCommandLine></CustomCommandLine>
    <Files></Files>
    <Script>&lt;#

    .SYNOPSIS
    Enable Wake On LAN settings on NIC in Windows

    .DESCRIPTION

    IMPORTANT NOTE: I borrowed some from the WMI portions from here: http://justanothertechnicalblog.blogspot.com/2012/06/setting-power-management-options-on.html

    This script will set the appropriate Windows-side
    Wake-On LAN settings on the NIC that is currently
    CONNECTED and has a match for the name "Ethernet"
    OR "Local Area Connection"

    This script will check/set the following:

    1. "Allow the device to wake the computer" to CHECKED
    2. "Only allow a magic packet to wake the computer" to CHECKED
    3. "Energy Efficient Ethernet" to OFF
    4. Fast Startup to DISABLED (Windows 8-10 only)

    ===============================================================
    If your NIC is named something else, just change the "-match"
    references on the "Get-NetAdapter" command below
    ===============================================================

    NOTE: You will still need to make certain Wake On LAN is enabled
    in the BIOS.

    written by Mike Resnick 05-15-2018

    #&gt;

    $nic = Get-NetAdapter | ? {($_.MediaConnectionState -eq "Connected") -and (($_.name -match "Ethernet") -or ($_.name -match "local area connection"))}
    $nicPowerWake = Get-WmiObject MSPower_DeviceWakeEnable -Namespace root\wmi | where {$_.instancename -match [regex]::escape($nic.PNPDeviceID) }
    If ($nicPowerWake.Enable -eq $true)
    {
    # All good here
    write-output "MSPower_DeviceWakeEnable is TRUE"
    }
    Else
    {
    write-output "MSPower_DeviceWakeEnable is FALSE. Setting to TRUE..."
    $nicPowerWake.Enable = $True
    $nicPowerWake.psbase.Put()
    }

    $nicMagicPacket = Get-WmiObject MSNdis_DeviceWakeOnMagicPacketOnly -Namespace root\wmi | where {$_.instancename -match [regex]::escape($nic.PNPDeviceID) }
    If ($nicMagicPacket.EnableWakeOnMagicPacketOnly -eq $true)
    {
    # All good here
    write-output "EnableWakeOnMagicPacketOnly is TRUE"
    }
    Else
    {
    write-output "EnableWakeOnMagicPacketOnly is FALSE. Setting to TRUE..."
    $nicMagicPacket.EnableWakeOnMagicPacketOnly = $True
    $nicMagicPacket.psbase.Put()
    }

    # Since different NICs will have different registry keys,
    # this recursively scans through the reigstry to find the
    # the EEELinkAdvertisement property
    $FindEEELinkAd = Get-ChildItem "hklm:\SYSTEM\ControlSet001\Control\Class" -Recurse -ErrorAction SilentlyContinue | % {Get-ItemProperty $_.pspath} -ErrorAction SilentlyContinue | ? {$_.EEELinkAdvertisement} -ErrorAction SilentlyContinue
    If ($FindEEELinkAd.EEELinkAdvertisement -eq 1)
    {
    Set-ItemProperty -Path $FindEEELinkAd.PSPath -Name EEELinkAdvertisement -Value 0
    # Check again
    $FindEEELinkAd = Get-ChildItem "hklm:\SYSTEM\ControlSet001\Control\Class" -Recurse -ErrorAction SilentlyContinue | % {Get-ItemProperty $_.pspath} | ? {$_.EEELinkAdvertisement}
    If ($FindEEELinkAd.EEELinkAdvertisement -eq 1)
    {
    write-output "$($env:computername) - ERROR - EEELinkAdvertisement set to $($FindEEELinkAd.EEELinkAdvertisement)"
    }
    Else
    {
    write-output "$($env:computername) - SUCCESS - EEELinkAdvertisement set to $($FindEEELinkAd.EEELinkAdvertisement)"
    }
    }
    Else
    {
    write-output "EEELinkAdvertisement is already turned OFF"
    }

     

    # Disable Fast Startup in Windows 8-10 (Fast Startup breaks Wake On LAN)
    If ((gwmi win32_operatingsystem).caption -match "Windows 8")
    {
    write-output "Windows 8.x detected. Disabling Fast Startup, as this breaks Wake On LAN..."
    powercfg -h off
    }
    ElseIf ((gwmi win32_operatingsystem).caption -match "Windows 10")
    {
    write-output "Windows 10 detected. Disabling Fast Startup, as this breaks Wake On LAN..."
    # This checks if HiberbootEnabled is equal to 1
    $FindHiberbootEnabled = Get-ItemProperty "hklm:\SYSTEM\CurrentControlSet\Control\Session?Manager\Power" -ErrorAction SilentlyContinue
    If ($FindHiberbootEnabled.HiberbootEnabled -eq 1)
    {
    write-output "HiberbootEnabled is Enabled. Setting to DISABLED..."
    Set-ItemProperty -Path $FindHiberbootEnabled.PSPath -Name "HiberbootEnabled" -Value 0 -Type DWORD -Force | Out-Null
    }
    Else
    {
    write-output "HiberbootEnabled is already DISABLED"
    }
    }

    </Script>
    <SuccessCodes>0</SuccessCodes>
    <RunAs value="null" />
    <Conditions type="list">
    <PackageStepCondition>
    <Architecture>Both</Architecture>
    <Version>All</Version>
    <TypeName>OperatingSystem</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <IsUserLoggedOn>AlwaysRun</IsUserLoggedOn>
    <TypeName>LoggedOnUser</TypeName>
    </PackageStepCondition>
    <PackageStepCondition>
    <ConditionMode>None</ConditionMode>
    <InventoryCollectionId value="null" />
    <InventoryCollectionName></InventoryCollectionName>
    <TypeName>Collection</TypeName>
    </PackageStepCondition>
    </Conditions>
    <ErrorMode>StopDeploymentFail</ErrorMode>
    <Title>Windows Settings ONLY</Title>
    <TypeName>PowerShell</TypeName>
    <IsEnabled value="true" />
    <IsPostStep value="false" />
    <IsPreStep value="false" />
    </PowerShellStep>
    </Steps>
    <Timeout value="60" />
    <UseCustomTimeout value="false" />
    <RunAs value="null" />
    </PackageDefinition>
    <Description>This script will set the appropriate Windows-side
    Wake-On LAN settings on the NIC that is currently
    CONNECTED and has a match for the name "Ethernet"
    OR "Local Area Connection"

    This script will check/set the following:

    1. "Allow the device to wake the computer" to CHECKED
    2. "Only allow a magic packet to wake the computer" to CHECKED
    3. "Energy Efficient Ethernet" to OFF
    4. Fast Startup to DISABLED (Windows 8-10 only)

    ===============================================================
    If your NIC is named something else, just change the "-match"
    references on the "Get-NetAdapter" command below
    ===============================================================

    NOTE: You will still need to make certain Wake On LAN is enabled
    in the BIOS.

    written by Mike Resnick 05-15-2018</Description>
    <NewLibraryPackageVersionId value="null" />
    <OriginalId value="null" />
    <Version></Version>
    <IsAutoDownload value="false" />
    <FolderId value="1" />
    <LibraryPackageVersionId value="null" />
    <Name>Wake on LAN - Windows Settings ONLY</Name>
    <Path>Packages\Wake on LAN - Windows Settings ONLY</Path>
    <PackageDisplaySettings name="DisplaySettings">
    <DisplayType>Normal</DisplayType>
    <IconKey>Icon-Package</IconKey>
    <SortOrder value="232" />
    </PackageDisplaySettings>
    </Package>
    </AdminArsenal.Export>

    END XML ====================================================

    Good luck! If you have any issues, let me know.

    -Mike

    0
  • Great write up.  I'll mess with it in my copious spare time!

    Thanks!

    0
  • Mike,

    Thanks for the info, I'll give this a go...

    One thing I know might not allow this to work is some of our older PC's.. I've tried it on a couple of old HP machines manually and the WOL just doesn't want to kick in, need to get some time to spend on these to see if I've just missed something or they are just too old for this to work... but on some of the newer models it works just fine.

    Thanks again for the info.

    Mick.

    0
  • Hey folks, sorry to necro a topic but we have recently had issues with this script working. It only started with the newer model lenovo laptops we received. The error is below. 

    MSPower_DeviceWakeEnable is FALSE. Setting to TRUE...

    The property 'Enable' cannot be found on this object. Verify that the property exists and can be set.

    At C:\WINDOWS\AdminArsenal\PDQDeployRunner\service-1\exec\woltest.ps1:44 char:5

    +     $nicPowerWake.Enable = $True

    +     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        + CategoryInfo          : InvalidOperation: (:) [], ParentContainsErrorRecordException

        + FullyQualifiedErrorId : PropertyNotFound


    Any help would be awesome.Thanks.

    0
  • Tech Dave is Wake on LAN enabled in the BIOS? Also, some newer network adapters have a "Wake on Link" setting in the advanced settings of the device properties in Device Manager, which may also need to be on.

    0