从Intune执行PowerShell脚本时失败

nfs0ujit  于 2023-05-07  发布在  Shell
关注(0)|答案(3)|浏览(263)

我在自己的设备之外通过Intune运行PowerShell脚本遇到了困难。其背景如下。
我希望在每个用户的凭据上下文中将企业映像部署到每个用户的工作站,因为这些映像将用作Microsoft Teams背景。因此,它们需要部署到C:\Users\〈user name〉\AppData\Roaming \Microsoft\Teams\Backgrounds\Uploads(注意,我们没有Teams Premium许可证,因此无法通过Teams Admin Center部署映像)。
当我在本地执行我的脚本时,无论是在我的笔记本电脑上还是在另一台笔记本电脑上,脚本都能正常执行,并且图像被部署到正确的目录中。这已经使用本地管理员帐户和非特权用户帐户进行了测试。
当我添加脚本并将其分配到一个组进行部署时,它在我的机器上继续正常工作,但在其他笔记本电脑上失败,并出现以下错误-

PS〉TerminatingError(Import-Module):“未能加载文件或程序集“System.Management.Automation,Version=7.2.0.0,Culture=neutral,PublicKeyToken= 31 bf 3856 ad 364 e35”或它的某一个依赖项。系统找不到指定的文件。"
Connect-PnPOnline:在模块“PnP. PowerShell”中找到“Connect-PnPOnline”命令,但无法加载该模块。有关详细信息,请运行“Import-Module PnP. PowerShell”。

请注意,如果我将脚本复制到另一台笔记本电脑并以非管理员权限登录,它将成功运行,因此我知道本机环境支持该脚本。只有通过Intune执行时才会失败。我在网上搜索过,到目前为止还没有找到解决方案。
下面是我正在执行的脚本-

#Script for uploading Teams Corporate Backgrounds 
Start-Transcript -Path "C:\Apps\Teams_Background.log"
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Scope CurrentUser -Force
Unregister-PSRepository -Name PSGallery
Register-PSRepository -Default
# Determine if the PnP.PowerShell module needs to be installed
try {
    Write-Host "Attempting to locate PnP.PowerShell module"
    $PnPModule = Get-InstalledModule -Name PnP.PowerShell -Verbose:$false
    if ($null -ne $PnPModule) {
    Write-Host "Authentication module detected"
    }
    }
    catch [System.Exception] {
    Write-Host "Unable to detect PnP.PowerShell module, attempting to install from PSGallery"
    try {
    
    # Install PnP.PowerShell module
    Install-Module -Name PnP.PowerShell -Scope CurrentUser -Force -Confirm:$false -Verbose:$false
    Write-Host "Successfully installed PnP.PowerShell"
    }
    catch [System.Exception] {
    Write-Host "An error occurred while attempting to install PnP.PowerShell module. Error message: $($_.Exception.Message)" ; break
    }
    }
# Determine if the Az.Keyvault module needs to be installed
try {
    Write-Host "Attempting to locate Az.Keyvault module"
    $AzModule = Get-InstalledModule -Name Az.Keyvault -Verbose:$false
    if ($null -ne $AzModule) {
    Write-Host "Authentication module detected"
    }
    }
    catch [System.Exception] {
    Write-Host "Unable to detect Az.Keyvault module, attempting to install from PSGallery"
    try {
    
    # Install Az module
    Install-Module -Name Az.Keyvault  -Scope CurrentUser -Force -Confirm:$false -Verbose:$false
    Write-Host "Successfully installed Az.Keyvault"
    }
    catch [System.Exception] {
    Write-Host "An error occurred while attempting to install Az.Keyvault module. Error message: $($_.Exception.Message)" ; break
    }
    }
# Set variables for the SharePoint site and library
$tenant = "company.onmicrosoft.com"
$siteURL = "https://company.sharepoint.com/library"
$applicationID = "xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
$library = "/Shared Documents/Templates & Branding/MS Teams Backgrounds"
$filename1 = "Teams_Background_file.jpg"
$filename2 = "Teams_Background_file_thumb.jpg"
$sourcepath1 = Join-Path $library $filename1
$sourcepath2 = Join-Path $library $filename2
$pathdir = Join-Path $ENV:Appdata "Microsoft\Teams\Backgrounds\Uploads"
    
#Create Backgrounds\Uploads folder if it doesn't exist
If (!(Test-Path $pathdir)) {
New-Item -ItemType Directory -Path $pathdir -Force | Out-Null
}
# Specify Key Vault Name and Certificate Name
$VaultName = "SharePointAuthentication"
$certName = "Certname"
# Establish a connection to Azure 
$clientID = "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
$key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
$SecurePassword = $key | ConvertTo-SecureString -AsPlainText -Force
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $clientID, $SecurePassword
$tenantID = "xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
$library = "/Shared Documents/Templates & Branding"
Connect-AzAccount -Credential $cred -TenantId $tenantID -ServicePrincipal
# Get certificate stored in KeyVault
$secret = Get-AzKeyVaultSecret -VaultName $vaultName -Name $certName
# $secretValueText = ($secret.SecretValue | ConvertFrom-SecureString -AsPlainText )
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secret.SecretValue)
$secretValueText = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
# connect to PnP
Connect-PnPOnline -Url $siteUrl -ClientId $applicationID -Tenant $tenant -CertificateBase64Encoded $secretValueText

# Upload the files to the library
Get-PnPFile $sourcepath1 -Path $pathdir -Filename $filename1 -AsFile -Force
Get-PnPFile $sourcepath2 -Path $pathdir -Filename $filename2 -AsFile -Force
# Disconnect from SharePoint Online
Disconnect-PnPOnline
Stop-Transcript

在我的机器上,我已经成功地运行了Windows PowerShell桌面版本5.1.22621.963和PowerShell核心版本7.3.3
看起来它通过Intune部署时的执行方式与它在本地运行的方式不同,但我不明白为什么。
任何帮助将不胜感激。

vq8itlhq

vq8itlhq1#

今天早上升级到PnP Powershell 2.1.1后出现了同样的错误。
我回到了1.12.0版本,在那之后,我的代码又开始工作了。

Uninstall-Module PnP.Powershell
Install-Module -Name PnP.PowerShell -RequiredVersion 1.12.0
7gs2gvoe

7gs2gvoe2#

我最终把我需要的图像文件放在一个可访问的网站上,只是使用Invoke-WebRequest代替。这样就不需要与Pnp.Powershell进行任何交互,解决了我的问题。

pdsfdshx

pdsfdshx3#

我昨天在我们的Azure DevOps发布管道中遇到了这个确切的问题(在此之前的几个月里工作得很好)。
根据本文档(https://github.com/pnp/powershell/blob/dev/MIGRATE-1.0-to-2.0.md)v2.x的PnP。PowerShell只能与PowerShell 7.2.x或更高版本正常工作。
我能够通过强制我们的PowerShell任务使用PowerShell Core而不是默认的V5来修复管道。我通过在Advanced下设置此复选框来更新任务:

如果你使用YAML管道,正确的语法应该是这样的:

- task: PowerShell@2
  displayName:  RunWithPs7
  inputs:
    pwsh: true
    filePath: '$(Pipeline.Workspace)\s\PowerShell\GetVersion.ps1'

(YAML示例来源:https://microsoft-bitools.blogspot.com/2021/02/devops-snack-change-powershell-version.html
也许Intune也有一个选项来强制使用这个版本?

相关问题