我在 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 将删除您的帐户对于非特权用户,正如我们所知,如果它们不在同一上下文中运行,您将不会将驱动器部署到您的管理员帐户中。
引自http://pcloadletter.co.uk/2010/05/15/missing-network-drives/
因此,您将禁用 UAC,您的 GPO-Logon-Script 将起作用。你很高兴,但随后你意识到你不能再使用边缘了。
那么我们如何启用 UAC 并让我们的登录脚本正常工作呢?
我这样做是由 Microsoft不支持的Registry Hack 完成的。我想这是您系统安全的一个漏洞,如果您以与我相同的方式执行此操作,请记住这一点:
还有 BAM!您可以使用登录脚本、UAC、edge 等。
您可以尝试的其他事情 - 我还没有尝试过任何这些:
因此,希望这对其他登录脚本有问题的管理员有用。
干杯!
我认为您调用正在导入的文件可能存在您的问题。这些文件是否存储在相关 GPO 的 sysvol 中?.\ 表示它正在与相关文件的脚本在同一目录中查找。
现在,如果“获取内容”文件位于正确的位置,则可能是您正在调用可能尚未初始化的用户名环境变量。尝试使用 Brandyn 建议的日志测试正确的加载和变量。