为什么我的登录脚本没有映射任何驱动器?

为什么我的登录脚本没有映射任何驱动器?

我在 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)    
    }
}

答案1

我现在有解决方案了。

是什么导致了您的登录脚本不想映射驱动器这种行为?

如果您使用的是 Windows 10,则需要使用 Edge、计算器和 PDF 应用。Microsoft 表示您需要启用 UAC,否则将无法使用。因此,您可以通过 GPO(注册码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 就可以正常工作了。您一时感到高兴,但随后您意识到自己再也无法使用 Edge 了。

那么我们如何启用 UAC 并使我们的登录脚本正常运行?

我用微软的这个做了不支持注册表黑客。我猜测这是你的系统安全的一个漏洞,如果你按照我的方式去做的话,请记住这一点:

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

然后 BAM!您可以使用登录脚本、UAC、edge 等等。

您可以尝试的其他方法 - 我尚未尝试过以下任何一种方法:

  • 在存储在 GPO 中的批处理脚本中调用您的 PS 文件
  • 将 PS 脚本设置为 GPO 内的计划任务

所以希望这对其他登录脚本有问题的管理员有用。

干杯!

答案2

我认为您的问题可能存在于调用您正在导入的文件时。这些文件是否存储在相关 GPO 的 sysvol 中? .\ 表示它正在与相关文件的脚本相同的目录中查找。
现在,如果“Get-content”文件位于正确的位置,则可能是您正在调用尚未初始化的用户名环境变量。尝试使用 Brandyn 建议的日志测试正确的加载和变量。

相关内容