Windows

為什麼我的登錄腳本沒有映射任何驅動器?

  • April 5, 2016

我在 PowerShell 中編寫了一個登錄腳本。該腳本嵌​​入在 GPO 中,並在使用者登錄域時執行。

我的問題是,我在腳本中部署的驅動器沒有被部署。我確信登錄腳本會執行,因為在腳本結束時我會向自己發送一封電子郵件,並且我總是會收到它。所以執行腳本應該不是問題。$Error每次腳本執行時,我都會記錄整個變數,並且沒有跡象表明為什麼會發生此錯誤。

我幾乎可以肯定錯誤不在腳本本身 - 我認為它必須是權限錯誤。

我認為當我在執行腳本時指定參數時可以解決這個問題-NoProfile,但我不知道將它放在 GPO 的哪個位置。由於美觀的原因,我不想要一個呼叫腳本的批處理文件:-)。

編輯:指定-noprofile沒有解決問題

編輯:由於有評論說沒有足夠的關於如何映射驅動器的資訊,我將整個映射部分粘貼在下面:

# UserOU as a parameter, value set in GPO
Param([string]$UserOU)

# preparing some stuff...
Import-Module .\SecureStringFunctions.psm1
[Byte[]]$key = (1..16)
$pw = Get-Content .\LocalAdminCred.txt | ConvertTo-SecureString -key $key

# Tried this to elevate the Script IF it's needed. Didn't solve my problem. works only on PS 4.0 but didn't solve the issue on my 5.0 machine
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) 
{ Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; exit }

# Import CSV with drive information based on username and userOU to get every maps that the current user needs
# also replacing a string inside the CSV for current session to map the homedrive of each user
$Drives = (Get-Content .\NetworkDrives.csv) -replace "userhome",$env:username | ConvertFrom-CSV -Delimiter ';' | ? {
   (($_.Group.split(',') -contains $UserOU) -or ($_.Group.split(',') -contains $env:username)) -and (!(Test-Path $_.Letter))
} 

# When I export the $Drives Variable at this point, all drives were read correctly, so the failure must occur in the mapping

# map all drives for current user. Drives to DMZ with password in plain text because ".mapnetworkdrive" only accepts plain text.
$Drives | % {
   if (![system.string]::IsNullOrEmpty($_.Username)) {
       if (($UserOU -like 'admin*') -and (($_.Server -ne $env:computername) -or ([system.string]::IsNullOrEmpty($_.Server)))) { 
           Continue
       }
       [string]$pwplain = ConvertFrom-SecureString $pw -AsPlainText -Force
       $Map = New-Object -comobject Wscript.Network
       $Map.MapNetworkDrive($_.letter,$_.path,$false,$_.username,$pwplain)
       $pwplain = ""
   } else { 
       $Map = New-Object -comobject Wscript.Network
       $Map.MapNetworkDrive($_.letter,$_.path,$false)    
   }
}

我現在有辦法了。

是什麼造成了您的登錄腳本不想映射驅動器的這種行為?

如果你有 Windows 10,你想使用 Edge、計算器和 PDF 應用程序。微軟說你需要為此啟用 UAC,否則它將無法工作。因此,您通過 GPO (Reg. Key EnableLua) 啟用 UAC。https://technet.microsoft.com/en-us/library/dd835564%28v=ws.10%29.aspx

但是:如果您在 GPO 中部署登錄腳本,並且您的使用者是他登錄的電腦上的本地管理員 - 在我的情況下是在每台電腦上,因為我是域管理員 - UAC 將刪除您的帳戶對於非特權使用者,正如我們所知,如果它們不在同一上下文中執行,您將不會將驅動器部署到您的管理員帳戶中。

這實際上是設計使然,是由 UAC 的工作方式造成的。當您是管理員組的成員並登錄時,您的帳戶會被 UAC 破壞為非特權使用者。此執行上下文與您在右鍵點擊命令提示符並以管理員身份啟動時獲得的上下文完全分開。您可能已經註意到,在一個上下文中連接的網路驅動器在另一個上下文中不可見。問題是基於 GPO 的登錄腳本是在管理員上下文中執行的,而不是在普通使用者上下文中。

引自http://pcloadletter.co.uk/2010/05/15/missing-network-drives/

因此,您將禁用 UAC,您的 GPO-Logon-Script 將起作用。你很高興,但隨後你意識到你不能再使用邊緣了。

那麼我們如何啟用 UAC 並讓我們的登錄腳本正常工作呢?

我這樣做是由 Microsoft不支持的Registry Hack 完成的。我這是您系統安全的一個漏洞,如果您以與我相同的方式執行此操作,請記住這一點:

HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System
New Entry: Type: DWORD Name: "EnableLinkedConnections" Value: 1

還有 BAM!您可以使用登錄腳本、UAC、edge 等。

您可以嘗試的其他事情 - 我還沒有嘗試過任何這些:

  • 在儲存在 GPO 中的批處理腳本中呼叫您的 PS 文件
  • 將您的 PS 腳本設置為 GPO 內的計劃任務

因此,希望這對其他登錄腳本有問題的管理員有用。

乾杯!

引用自:https://serverfault.com/questions/768028