OneDrive Next Gen (2016)

Hello,

Microsoft released the new OneDrive Next Generation (Build 17.3.6281.1202) in order to replace Groove, the syncing tool built-in to Office 2013. However, there is no automatic deployment and you have to script and deploy it with GPO/SCCM.

PSAppDeployToolkit was a perfect choice !

My script proceeds as follows:
– unsync the user’s library (clear the OneDrive caches from %LocalAppData% without deleting any personal data)
– disable the Groove process (rename Groove.exe to Groove.exe.OLD, which is totally impactless)
– silent-install OneDrive NG
– auto-launch OneDrive NG in the Business configuration (don’t forget to change your Tenant ID in the 3rd part of the script)

– User has already synced with Groove and will not be prompted to enter his account (O365)
– User has never used Groove and is prompted to enter his UPN’s account (UPN format for SSO)username@any.domain.company.com

Download :
http://1drv.ms/1KgX4Uy

Pierrick

New link !
http://1drv.ms/1OGMIBx

Pierrick, your both links seems to be broken

the script sounds interesting, can you please share it

thank you

Oh, it seems we have to rebuild a new link sometimes !

https://onedrive.live.com/redir?resid=1C235E3F778E4F17!16543&authkey=!APajn9D5gVLjAw4&ithint=file%2Cps1

Hope this script will helps you, don’t hesitate to share your comments

Finally, should be easier if I copy/paste the code here

<#
.SYNOPSIS
This script performs the installation or uninstallation of an application(s).
.DESCRIPTION
The script is provided as a template to perform an install or uninstall of an application(s).
The script either performs an “Install” deployment type or an “Uninstall” deployment type.
The install deployment type is broken down into 3 main sections/phases: Pre-Install, Install, and Post-Install.
The script dot-sources the AppDeployToolkitMain.ps1 script which contains the logic and functions required to install or uninstall an application.
.PARAMETER DeploymentType
The type of deployment to perform. Default is: Install.
.PARAMETER DeployMode
Specifies whether the installation should be run in Interactive, Silent, or NonInteractive mode. Default is: Interactive. Options: Interactive = Shows dialogs, Silent = No dialogs, NonInteractive = Very silent, i.e. no blocking apps. NonInteractive mode is automatically set if it is detected that the process is not user interactive.
.PARAMETER AllowRebootPassThru
Allows the 3010 return code (requires restart) to be passed back to the parent process (e.g. SCCM) if detected from an installation. If 3010 is passed back to SCCM, a reboot prompt will be triggered.
.PARAMETER TerminalServerMode
Changes to “user install mode” and back to “user execute mode” for installing/uninstalling applications for Remote Destkop Session Hosts/Citrix servers.
.PARAMETER DisableLogging
Disables logging to file for the script. Default is: $false.
.EXAMPLE
Deploy-Application.ps1
.EXAMPLE
Deploy-Application.ps1 -DeployMode ‘Silent’
.EXAMPLE
Deploy-Application.ps1 -AllowRebootPassThru -AllowDefer
.EXAMPLE
Deploy-Application.ps1 -DeploymentType Uninstall
.NOTES
Toolkit Exit Code Ranges:
60000 - 68999: Reserved for built-in exit codes in Deploy-Application.ps1, Deploy-Application.exe, and AppDeployToolkitMain.ps1
69000 - 69999: Recommended for user customized exit codes in Deploy-Application.ps1
70000 - 79999: Recommended for user customized exit codes in AppDeployToolkitExtensions.ps1
.LINK
http://psappdeploytoolkit.com
#>
[CmdletBinding()]
Param (
[Parameter(Mandatory=$false)]
[ValidateSet(‘Install’,‘Uninstall’)]
[string]$DeploymentType = ‘Install’,
[Parameter(Mandatory=$false)]
[ValidateSet(‘Interactive’,‘Silent’,‘NonInteractive’)]
[string]$DeployMode = ‘Interactive’,
[Parameter(Mandatory=$false)]
[switch]$AllowRebootPassThru = $false,
[Parameter(Mandatory=$false)]
[switch]$TerminalServerMode = $false,
[Parameter(Mandatory=$false)]
[switch]$DisableLogging = $false
)

Try {
## Set the script execution policy for this process
Try { Set-ExecutionPolicy -ExecutionPolicy ‘ByPass’ -Scope ‘Process’ -Force -ErrorAction ‘Stop’ } Catch {}

##*===============================================
##* VARIABLE DECLARATION
##*===============================================
## Variables: Application
[string]$appVendor = 'Microsoft'
[string]$appName = 'OneDrive'
[string]$appVersion = '17.3.6281.1202'
[string]$appArch = 'x86'
[string]$appLang = 'FR'
[string]$appRevision = '01'
[string]$appScriptVersion = '3.6.7'
[string]$appScriptDate = '01/11/2016'
[string]$appScriptAuthor = 'PIELUCAS'
##*===============================================

##* Do not modify section below
#region DoNotModify

## Variables: Exit Code
[int32]$mainExitCode = 0

## Variables: Script
[string]$deployAppScriptFriendlyName = 'Deploiement OneDrive Next Gen'
[version]$deployAppScriptVersion = [version]'11.01.2016'
[string]$deployAppScriptDate = '11/01/2016'
[hashtable]$deployAppScriptParameters = $psBoundParameters

## Variables: Environment
If (Test-Path -LiteralPath 'variable:HostInvocation') { $InvocationInfo = $HostInvocation } Else { $InvocationInfo = $MyInvocation }
[string]$scriptDirectory = Split-Path -Path $InvocationInfo.MyCommand.Definition -Parent


## Dot source the required App Deploy Toolkit Functions
Try {
	[string]$moduleAppDeployToolkitMain = "$scriptDirectory\AppDeployToolkit\AppDeployToolkitMain.ps1"
	If (-not (Test-Path -LiteralPath $moduleAppDeployToolkitMain -PathType 'Leaf')) { Throw "Module does not exist at the specified location [$moduleAppDeployToolkitMain]." }
	If ($DisableLogging) { . $moduleAppDeployToolkitMain -DisableLogging } Else { . $moduleAppDeployToolkitMain }
}
Catch {
	If ($mainExitCode -eq 0){ [int32]$mainExitCode = 60008 }
	Write-Error -Message "Module [$moduleAppDeployToolkitMain] failed to load: <code>n$($_.Exception.Message)</code>n `n$($_.InvocationInfo.PositionMessage)" -ErrorAction 'Continue'
	## Exit the script, returning the exit code to SCCM
	If (Test-Path -LiteralPath 'variable:HostInvocation') { $script:ExitCode = $mainExitCode; Exit } Else { Exit $mainExitCode }
}

#endregion
##* Do not modify section above
##*===============================================
##* END VARIABLE DECLARATION
##*===============================================

If ($deploymentType -ine 'Uninstall') {
	##*===============================================
	##* PRE-INSTALLATION
	##*===============================================
	[string]$installPhase = 'Pre-Installation'
	
	## Show Welcome Message, close Office apps, allow up to 3 deferrals, and verify there is enough disk space to complete the install
	Show-InstallationWelcome -CloseApps "winword,excel,onenote,outlook,winproj,visio" -AllowDefer -DeferTimes 2 -CheckDiskSpace

		## Display Pre-Install cleanup status
		Show-InstallationProgress -StatusMessage '[1/3] Mise à niveau OneDrive...'
		
		# Unset Groove
                Write-Log -Message 'Déconfiguration de Microsoft Office Groove' -Source $deployAppScriptFriendlyName
                Execute-ProcessAsUser -Path "powershell.exe" -Parameters "cmd.exe /C RD /S /Q %LOCALAPPDATA%\Microsoft\Office\15.0\OfficeFileCache"
                Execute-ProcessAsUser -Path "powershell.exe" -Parameters "cmd.exe /C RD /S /Q %LOCALAPPDATA%\Microsoft\Office\Spw"
	
	##*===============================================
	##* INSTALLATION
	##*===============================================
	[string]$installPhase = 'Installation'

		Show-InstallationProgress -StatusMessage '[2/3] Mise à niveau OneDrive...'
		Execute-Process -Path "$scriptDirectory\Files\OneDriveSetup.exe" -Parameters "/silent" -WindowStyle Hidden
	
	
	##*===============================================
	##* POST-INSTALLATION
	##*===============================================
	[string]$installPhase = 'Post-Installation'
	
			Show-InstallationProgress -StatusMessage '[3/3] Mise à niveau OneDrive...'
            Rename-Item -Path "$env:CommonProgramFiles\Microsoft Office 15\root\office15\GROOVE.EXE" -NewName "$env:CommonProgramFiles\Microsoft Office 15\root\office15\GROOVE.EXE.OLD"
            Execute-ProcessAsUser -Path "powershell.exe" -Parameters "cmd.exe /C DEL /F /Q %LOCALAPPDATA%\Microsoft\Windows\Start Menu\Programs\Microsoft Office 2013\OneDrive Entreprise 2013.lnk"
            Execute-ProcessAsUser -Path "powershell.exe" -Parameters "cmd.exe /C DEL /F /Q %LOCALAPPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\OneDrive Entreprise.lnk"
            Execute-ProcessAsUser -Path "powershell.exe" -Parameters "cmd.exe /C DEL /F /Q %USERPROFILE%\Links\OneDrive.lnk"
            Execute-ProcessAsUser -Path "powershell.exe" -Parameters "cmd.exe /C RD /S /Q %USERPROFILE%\OneDrive"
            Start-Sleep -Seconds 2
            Execute-ProcessAsUser -Path "powershell.exe" -Parameters "cmd.exe /C %LOCALAPPDATA%\Microsoft\OneDrive\OneDrive.exe /configure_business:&lt;TenantID&gt;"
            Start-Sleep -Seconds 2
}
ElseIf ($deploymentType -ieq 'Uninstall')
{
	##*===============================================
	##* PRE-UNINSTALLATION
	##*===============================================
	[string]$installPhase = 'Pre-Uninstallation'
	
	## Show Welcome Message, close applications that cause uninstall to fail
	Show-InstallationWelcome -CloseApps 'onedrive'
	
	## Show Progress Message (with the default message)
	Show-InstallationProgress
	
	
	##*===============================================
	##* UNINSTALLATION
	##*===============================================
	[string]$installPhase = 'Uninstallation'
	
	Execute-Process -Path "$scriptDirectory\Files\OneDriveSetup.exe" -Parameters "/uninstall" -WindowStyle Hidden -IgnoreExitCodes '1,2,3'
	
	
	##*===============================================
	##* POST-UNINSTALLATION
	##*===============================================
	[string]$installPhase = 'Post-Uninstallation'
	
	## &lt;Perform Post-Uninstallation tasks here&gt;
}

##*===============================================
##* END SCRIPT BODY
##*===============================================

## Call the Exit-Script function to perform final cleanup operations
Exit-Script -ExitCode $mainExitCode

}
Catch {
[int32]$mainExitCode = 1
[string]$mainErrorMessage = “$(Resolve-Error)”
Write-Log -Message $mainErrorMessage -Severity 3 -Source $deployAppScriptFriendlyName
Show-DialogBox -Text $mainErrorMessage -Icon ‘Stop’
Exit-Script -ExitCode $mainExitCode
}

Did you use SCCM to deploy this and if so did you create an application or package? Again assuming you used SCCM if it was a package that you used did you use run as admin or user?

I went ahead and created a package calling Deploy-Application.exe. Configuring the package to run as administrator allowing user interaction. The result is what I’ve been battling with my own solutions. The OneDrive configuration thinks it is being run as an administrator.

Dear Zak,

My script uses a PSADT function which is called “Execute-ProcessAsUser”. It generates a XML as current user which is currently logged on, so you’ve to set your program to run it “Only when a user is logged on” and “Run with user’s right” (refer to the PSADT documentation). In my company, we have one user per computer but I can advise you to “Run once for every user who logs on” in the Advanced panel from your program.

Be careful, as part of an OSD installation, OneDrive can’t be installed when no user has already been logged on because it only works with an existing AppData.

Execute-ProcessAsUser = Logged in Username under which to run the process from. Default is: The active console user. If no console user exists but users are logged in, such as on terminal servers, then the first logged-in non-console user.

I got it working I had to add -RunLevel ‘LeastPrivilege’ to the OneDrive.exe call used to configure the tenantId to prevent it from trying to run with higher elevation. I also added in checking for the client install and if the client had previously been configured. Thank you for the great deployment script!

Glad you liked this deployment script and thank you for your contribution Zak !

Thanks for the code you shared - can you provide insight into the detection method you leveraged for SCCM Application? Was it PowerShell, VBscript or simple file detection?

Awesome work here and its close to what I am looking for? My only question is how would this work if we are using roaming profiles and the local profile is removed at logoff?

Joel, you understand that Onedrive leaves almost no system borrow. I suggest you add a registry key in HKCU\SOFTWARE or something to keep a trace of its installation.

We’re using some Wyse devices (with volatile profile) in our organization and I could try this scenario in my spare time.
Keep in mind than OneDrive is user-based and will be only stored in the %APPDATA% path, so you’ll have to reinstall it (GPO, SCCM, scheduled job…) and let it download all datas at each login.

Thanks, just confirmed what I was thinking.