윈 도 우 파워쉘로 레지스트리 변경 시 권한문제 질문드립니다.
2022.11.04 17:08
안녕하세요
많은 장비를 설치하면서 특정시리얼포트를 맞춰주어야하기에 파워쉘로 만들어보고 있습니다.
시리얼포트는 3곳의 레지스트리를 수정하면 되는데
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM 에서 \Device\장치이름
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\장치인스턴스ID에서 Friendlyname
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\장치인스턴스ID\Device Parameters 에서 PortName
에서 해당 시리얼넘버로 변경하면 되기에 InstanceID를 가져와 Set-ItemProperty를 통해 레지스트리를 넣는 스크립트를 만들었습니다.
돌려보니 나머지 두개는 되는데 FriendlyName에서 권한에러가 발생하네요.
구글링 열심히해서 레지스트리 권한변경을 찾아서 봤는데
Get-acl에서 해당 레지스트리가 SYSTEM권한으로 되어있습니다
나온대로 key값 rule값 다 넣어서 관리자계정을 권한 넣었는데
Set-Acl조차 SYSTEM권한이어야한다고 뱉어버립니다.
구글에 나온 레지스트리들은 전부 SOFTWARE쪽이긴 하네요.
psexec -s powershell -noprofile -executionpolicy bypass -file 파일명.ps1으로 돌려보면 정상작동됩니다.
psexec로 파워쉘을 시스템권한으로 실행시키면 되는걸로 봐서 스크립트는 제대로 만든 것 같은데..
설치 시 파워쉘스크립트를 사용하는 툴을 쓰기 때문에 ps1파일로 만들어야하는데
ps1파일을 하나 더 만들어서 start-process로 psexec를 -s 넣어서 하기엔 좀 우습고...
psexec도 복사해와야하니..
이건 어떻게 좋은 방법이 없을까요
물론 cmd에서 reg add로도 안됩니다.
한줄요약
파워쉘에서 SYSTEM 레지스트리는 수정할 방법이 없을까요
감사합니다.
댓글 [3]
-
DarknessAngel 2022.11.04 18:30
-
zerojiddu 2022.11.04 19:08 제컴에서는 그 레지키 권한이 SYSTEM 이 아닌
오너가 Administrators로, 모든권한이 이미 설정돼 있는데
테스트 삼아 SYSTEM으로 바꾸고
밑의 스크립트를 파워쉘[관리자] 열고 치니 에러없이
오너 - Administrators, 권한 - 모든권한 으로 잘 바뀝니다.
전 블루투스 COM 시리얼포트 쪽을 해봤습니다.
* 이 스크립트를 테스트해 보시려면
에러나는 레지키 주소를 밑에서 주소부분만 바꿔주면 됩니다.
레지 주소 앞부분 HKLM은 빼고 적으면 됩니다.
밑 스크립트에 이미 레지 LocalMachine이 정의돼 있어서 그래요.
$regKey = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey("SYSTEM\CurrentControlSet\Enum\BTHENUM\{00001101-0000-1000-8000-00805f9b34fb}_LOCALMFG&0000\7&36d7d6f0&0&000000000000_00000000",[Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::TakeOwnership)
$regACL = $regKey.GetAccessControl()
$regACL.SetOwner([System.Security.Principal.NTAccount]"Administrators")
$regKey.SetAccessControl($regACL)
$regKey = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey("SYSTEM\CurrentControlSet\Enum\BTHENUM\{00001101-0000-1000-8000-00805f9b34fb}_LOCALMFG&0000\7&36d7d6f0&0&000000000000_00000000",[Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::ChangePermissions)
$regACL = $regKey.GetAccessControl()
$regRule = New-Object System.Security.AccessControl.RegistryAccessRule ("Administrators","FullControl","ContainerInherit","None","Allow")
$regACL.SetAccessRule($regRule)
$regKey.SetAccessControl($regACL) -
Grundy 2022.11.04 21:06
PS C:\Users\Administrator> $regKey = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey("SYSTEM\CurrentControlSet\Enum\FTDIBUS\VID_0403+PID_6001+AO001VSZA\0000",[Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::TakeOwnership)
Exception calling "OpenSubKey" with "3" argument(s): "Requested registry access is not allowed."
At line:1 char:1
+ $regKey = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey("SYSTEM ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SecurityException
ㅠㅠ 어렵네요 첫줄부터..
1. 권한을 부여하거나 소유자 변경
2. system 계정 권한으로 실행
둘중 하나 쓰면 될꺼에요