Set-ItemProperty не может найти путь при использовании CreateProcess и Powershell Start-Process в VBA - PullRequest
1 голос
/ 06 августа 2020

Мне нужно изменить ключи реестра из сценария VBA с помощью CreateProcess и Powershell. Далее вы найдете мой код VBA.

Когда я запускаю код внутри кавычек непосредственно в Powershell или с помощью команды windows run, ключ реестра настраивается так, как должен. Когда я использую этот код VBA, я получаю ошибку пути.

Путь абсолютно правильный. В том же сценарии VBA я без ошибок установил некоторые другие ключи reg, используя ту же команду. Я не знаю, в чем может быть ошибка. Я протестировал скрипт на двух fre sh Windows 10 виртуальных машинах с одинаковым результатом.

Заранее благодарю за любую помощь.

Dim pInfo As PROCESS_INFORMATION
Dim sInfo As STARTUPINFO
Dim sNull As String
Dim lSuccess As Long
Dim lRetValue As Long

lSuccess = CreateProcess(sNull, "powershell start-process -filepath powershell.exe -Argumentlist 'Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows` Defender` Security` Center\Notifications -Name DisableNotifications -Value 1' -verb RunAs -windowstyle hidden -Wait", ByVal 0&, ByVal 0&, 1&, CREATE_NO_WINDOW, ByVal 0&, sNull, sInfo, pInfo)
Set-ItemProperty : Der Pfad "HKLM:\SOFTWARE\Microsoft\Windows Defender Security Center\Notifications" kann nicht
gefunden werden, da er nicht vorhanden ist.
In C:\Users\public\psc.ps1:9 Zeichen:1
+ Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows` Defender` Se ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (HKLM:\SOFTWARE\...r\Notifications:String) [Set-ItemProperty], ItemNotFo
   undException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.SetItemPropertyCommand


Note---------------------------------------
(The german stuff at the beginning means the following)
The path "HKLM:\SOFTWARE\Microsoft\Windows Defender Security Center\Notifications" cannot be found, because it does not exist"

EDIT1:

Удивительно, но ключ reg устанавливается на моей виртуальной машине разработки, когда я запускаю там скрипт, о котором я только что узнал. Поэтому я предполагаю, что проблема связана с Windows или установленным программным обеспечением. Я уже проверил все отличия, которые только мог придумать, но не повезло

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

EDIT1: Итак, я наконец нашел реальное решение и причину этой проблемы. Как указано в старом «решении», существует проблема между 32-битной и 64-битной версиями Office. Я попытался установить значение реестра с помощью reg add и обнаружил, что он записывает в WOW6432 уровень совместимости для 32-битных приложений. Что довольно очевидно, если вы знаете, что это существует, потому что Office обычно является 32-битным приложением. Я предполагаю, что путь не может быть найден, потому что PowerShell работает в контексте 32-разрядного Office и пытается получить доступ к 64-разрядной части реестра. Команда reg add устанавливает значение в WOW6432, что не сработает, потому что Windows Defender Security Center не читает эти значения. Но есть флаг / reg: 64, который заставляет reg add писать в 64-битную часть реестра. И все работает как надо.

0 голосов
/ 06 августа 2020

Думаю, у вас проблемы с цитатами. Я предлагаю вам заключить путь в две одинарные кавычки и удалить в пути `:

Например,

$mystring = 'Get-ItemProperty -Path ''HKLM:\SOFTWARE\Microsoft\Windows Defender Security Center\Notifications'''
$mystring

Это приведет к выводу:

Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows Defender Security Center\Notifications'

Итак, ваш код должен выглядеть примерно так:

Dim pInfo As PROCESS_INFORMATION
Dim sInfo As STARTUPINFO
Dim sNull As String
Dim lSuccess As Long
Dim lRetValue As Long

lSuccess = CreateProcess(sNull, "powershell start-process -filepath powershell.exe -Argumentlist 'Set-ItemProperty -Path ''HKLM:\SOFTWARE\Microsoft\Windows Defender Security Center\Notifications'' -Name DisableNotifications -Value 1' -verb RunAs -windowstyle hidden -Wait", ByVal 0&, ByVal 0&, 1&, CREATE_NO_WINDOW, ByVal 0&, sNull, sInfo, pInfo)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...