web-dev-qa-db-ja.com

ログオンスクリプトがドライブをマッピングしないのはなぜですか?

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)    
    }
}
2
SimonS

私は今解決策を持っています。

ドライブをマップしたくないログオンスクリプトのこの動作を作成するものは何ですか?

Windows 10を使用している場合は、Edge、電卓、PDFアプリを使用します。 Microsoftは、そのために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が機能します。あなたは一瞬幸せですが、それからEdgeがもう使えないことに気付きます。

では、UACを有効にして、ログオンスクリプトを機能させるにはどうすればよいでしょうか。

Microsoftでこれを行いましたサポートされていませんレジストリハック。私は推測これはシステムセキュリティの脆弱性です。これを私と同じ方法で行う場合は、次の点に注意してください。

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

そしてバム!ログオンスクリプト、UAC、Edgeなどを使用できます。

あなたが試すことができる他のこと-私はまだそれらのどれも試していません:

  • GPOに保存されているバッチスクリプトでPSファイルを呼び出す
  • PSスクリプトをGPO内のスケジュールされたタスクとして設定する

うまくいけば、これはログオンスクリプトに問題がある他の管理者にとって役立つでしょう。

乾杯!

5
SimonS

インポートするファイルの呼び出しに問題があると思います。これらのファイルは、問題のGPO=のsysvolに保存されていますか?。\は、問題のファイルのスクリプトと同じディレクトリにあることを意味します。
「Get-content」ファイルが適切な場所にある場合、まだ初期化されていない可能性があるユーザー名の環境変数を呼び出している可能性があります。 Brandynが提案するようなログで、適切なロードと変数をテストしてみてください。

0