質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

2回答

322閲覧

Powershellでデジタル署名エラーが出ます

hatsuzo

総合スコア56

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2023/11/20 09:23

編集2023/11/30 01:08

実現したいこと

Powershellスクリプトで証明書のインストールを行いたい

前提

社内の全PCにデジタル証明書のインストールを行う必要性が出てきました。
ほとんどのPCは管理者権限が付いていないのですが、それを一時的に回避して管理者権限を付けたかったのですが、ネットで拾った情報に従い、行ってみたのですが、うまくいかず諦めました。
ADのGPOで証明書のインストールがテンプレートで入っているのですが、何度やってもうまくいかないので、powershellを使う方法があることを知り、試みています。

スクリプトと証明書は、該当者にアクセス権のあるファイルサーバー上に置いており、最終的には、各利用者にショートカットを配布して実行して貰う方法で考えています。

配布結果を資産管理ツールで把握できるよう、レジストリに書き込みを行い、チェックする処理も入れています。

発生している問題・エラーメッセージ

管理者権限を付けた状態で、以下のスクリプトはとりあえず動作するようなのですが、
管理者権限を付けたPCでもエラーが出て動作しないPCがあります。
証明書をインストールするために証明書が要るというのも変な話なので、そもそもやり方がおかしいのかもしれませんね。

ファイル \\svr\cert\cert_install.ps1を読み込めません。 ファイル \\svr\cert\cert_install.ps1はデジタル署名されていません。このスクリプトは現在のシステムで実行できません。

該当のソースコード

powershell

1# 管理者権限の一時的付与 -> うまくいきませんでした。 2if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) { Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs; exit } 3Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process 4# スクリプトのブロック解除 5#Unblock-File -Path "\\svr\cert\cert_install.ps1" 6# 確認する証明書のサムプリント 7$targetThumbprint = "*************" 8# チェックする証明書ストア 9$certificateStoreLocation = "Cert:\LocalMachine\Root" 10 11# インポートする電子証明書のパス 12$certificatePath = "\\svr\cert\CA***.crt" 13# インポートする際に指定するパスワード 14$certificatePassword = "hogehoge" 15 16# レジストリ情報 17$registryPath = "HKCU:\Software\myapp\Security" 18$propertyName = "mycert" 19 20# レジストリ情報の存在チェック 21$propertyExists = Get-ItemProperty -LiteralPath $registryPath -Name $propertyName -ErrorAction SilentlyContinue 22if ($propertyExists) { 23 # レジストリが見つかった場合 24 Write-Host "Resistory already exists." 25 # 証明書がインストールされているかどうかチェック 26 $certificate = Get-Item -LiteralPath (Join-Path $certificateStoreLocation $targetThumbprint) -ErrorAction SilentlyContinue 27 # 証明書が見つからなかった場合はインストール 28 if (-not $certificate) { 29 Write-Host "Certificate is not installed." 30 # 証明書をインストール 31 $certificate = Import-PfxCertificate -FilePath $certificatePath -CertStoreLocation Cert:\CurrentUser\My -Password (ConvertTo-SecureString -String $certificatePassword -AsPlainText -Force) 32 Write-Host "Thank you for your cooperation!! The certificate has been installed." 33 } else { 34 Write-Host "Thank you for your cooperation!! The certificate has been installed." 35 } 36} else { 37 # レジストリが見つからなかった場合 38 Write-Host "Resistory is not exists." 39 # 証明書をインストール 40 $certificate = Import-PfxCertificate -FilePath $certificatePath -CertStoreLocation Cert:\CurrentUser\My -Password (ConvertTo-SecureString -String $certificatePassword -AsPlainText -Force) 41 # レジストリキーが存在するか確認 42 if (-not (Test-Path $registryPath)) { 43 # レジストリキーが存在しない場合は作成 44 New-Item -Path $registryPath -Force 45 } 46 # レジストリプロパティが存在するか確認 47 if (-not (Test-Path "$registryPath\$propertyName")) { 48 # レジストリプロパティが存在しない場合は作成 49 New-ItemProperty -Path $registryPath -Name $propertyName -PropertyType 'Dword' -Value 1 -Force 50 } else { 51 Write-Host "Oops, The certificate is already installed." 52 } 53}

試したこと

先頭に、

powershell

1# スクリプトのブロック解除 2Unblock-File -Path "\\svr\cert\cert_install.ps1"

といれてみましたが、結果は同じでした。

補足情報(FW/ツールのバージョンなど)

ClientはWindows10、
スクリプトの置き場所はWindows2019です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2023/11/20 11:19

powershellの実行ポリシーを確認したという記述が無いのですが、 無署名のスクリプトが実行できないポリシー設定になっているだけでは?
hatsuzo

2023/11/21 01:17

コメント有難うございます。 それを標準設定から変更させたくないので、一時点な変更措置として、 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process を先頭で実行しているのですが、 そもそもPowershell自体がコマンドラインで動かせないので、これ自体が効かないということなのでしょうか? 同じOUに入っていて、管理者権限が付いているのも関わらず、私は動いているのに動いていないPCがあるのが判らない状況です。
otn

2023/11/21 05:39 編集

すいません。コードの中身を見てませんでした。回答を書きました。
guest

回答2

0

それを標準設定から変更させたくないので、一時点な変更措置として、Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Processを先頭で実行しているのですが、そもそもPowershell自体がコマンドラインで動かせないので、これ自体が効かないということなのでしょうか?

そうですね。「金庫の中に鍵を入れておいたので、それで金庫を開けて」みたいなことかと思います。

-Scope Processの情報は環境変数に設定されるようなので、
バッチファイルで環境変数を設定してそこから起動ではどうでしょうか?
また、\\svr\cert\cert_install.ps1というのはリモートファイルでは?そもそもRemoteSignedファイルだと署名しない限りは駄目でしょうね。

BAT

1set PSExecutionPolicyPreference=Bypass 2powershell -file \\svr\cert\cert_install.ps1

投稿2023/11/21 05:33

編集2023/11/21 05:40
otn

総合スコア84283

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsuzo

2023/11/21 07:35

回答頂きまして有難うございました。 バッチファイルでやってみましたが、結果は同じでした。 Powershellは何でもできてしまうだけにセキュリティ要件も厳しいですね。 バッチでやると、別プロセスの扱い、ってことになるのかもしれません。 管理者権限を与えることができると思って、細かいことができるPowershellで始めたのですが、 管理者権限を付与することができない以上、原点に立ち返って、バッチファイルだけでできないか検討してみようと思います。
otn

2023/11/21 09:38

> バッチでやると、別プロセスの扱い、ってことになるのかもしれません。 環境変数は子プロセスに伝搬するので、大丈夫です。 set PSExecutionPolicyPreference=Bypass の行はまるごとコピペしてますか? キーインしてるとタイプミスや余分の空白がエラーの原因となります。 とくにバッチファイルは余分に空白を書くと駄目ですが、一般のプログラミング言語のように、 set PSExecutionPolicyPreference = Bypass と書いてしまう人がたまに居ます。 ByPassで実行できないとなると全く別の原因かも知れません。 スクリプトの実行が始まった後のエラーなのに、同じメッセージと誤認しているとか。
hatsuzo

2023/11/29 09:52

お礼が遅れまして失礼しました。 アドバイス頂きまして有難うございます。 コピペしているのですが、うまくいきません。 同じエラーですので、バッチファイルで書き換えてみました。
otn

2023/11/29 16:08

どういうコードを実行したのかをコピペで載せるまでは、これ以上のアドバイスは困難です。
guest

0

自己解決

自己レスです。
PowerShellでやろうとしていたことをバッチファイルでやってみました。
管理者権限が付いていることが前提ですので、管理者権限の付いていない場合はスキップし、
証明書がインストールされていない時にインストールを行い、所定のレジストリに書き込むようにしました。
資産管理ツールの機能を使ってレジストリの値を拾えば、インストール状況を把握できるかなと思います。
アドバイス、閲覧頂きました方、有難うございました。

batch

1@echo off 2rem 3rem 証明書のインストール 4rem 5rem 検索対象の証明書 6set "CN=hogehoge" 7rem 更新レジストリのキー 8set "RegistryKey=HKCU\SOFTWARE\*****\*****" 9set "RegistryName=*****" 10 11rem 管理者権限のチェック AdministratorsのSidを探す(verによって変わる可能性あり) 12whoami /groups | find "S-1-5-32-544" > nul 13if %errorlevel% equ 0 ( 14 rem echo ### You have administrative privileges. ### 15) else ( 16 echo ### NG!!! ### You do not have administrative privileges. 17 echo ### NG!!! ### Please sign out 2 times and try again. 18 exit /b 1 19) 20 21rem 「信頼されたルート証明機関」ストアにインストールされた証明書の一覧を取得 22certutil -store Root | find /i "%CN%" 23if %errorlevel% equ 0 ( 24 echo ### OK!! ### Certificate is already installed. 25) else ( 26 certutil -addstore ROOT \\svr\cert\*****.crt 27 echo ### OK!! ### Certificate is now installed. 28 reg add "%RegistryKey%" /v "%RegistryName%" /t "REG_DWORD" /d 1 /f 29 echo ### OK!! ### Registry is now updated. 30)

投稿2023/11/29 10:00

hatsuzo

総合スコア56

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問