• 隐私摄像头


    win11 对于隐私操作管理和控制比较严格,导致应用去控制时比较麻烦。采用一种投机取巧的方案,修改注册表,让用户无法修改。然后通过代码的方式控制注册表实现摄像头的权限的控制

    通过修改注册表项 

    \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\default\Privacy\LetAppsAccessCamera
     

    状态说明:
    1.当value为0的时候  
    相机权限控制为可更改状态,权限会根据用户选择而变更
    2.当value为1的时候 
    相机权限不可修改,且固定为打开状态
    3.当value为2的时候
    相机权限不可修改,且固定为关闭状态
     
    但是只是通过修改这个项后,我们发现系统中设置界面没有同步更新过来
    在win11环境下 需要执行 
    C:\windows\system32\SystemSettingsAdminFlows.exe 这个应用  (需要管理员身份运行,如果是代码控制,需要x64)
    参数  
    SetCamSystemGlobal webcam 0 表示关闭
    SetCamSystemGlobal webcam 1 表示开启
    这个值暂时不知道在哪获取
     
    直接上代码了
     public class CameraSecurity 
        {
            private const string SystemSettingsAdminFlows = @"C:\Windows\System32\SystemSettingsAdminFlows.exe";
    
            private const string LetAppsAccessCamera = @"SOFTWARE\Microsoft\PolicyManager\default\Privacy\LetAppsAccessCamera";
            private const string Webcam = @"Software\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\webcam";
    
            /// <summary>
            /// 恢复到系统默认的操作方案
            ///  需要管理员权限
            /// </summary>
            public void ResetToSystemDefault()
            {
                SetPolicy(0x00000000);//全局允许
            }
    
            /// <summary>
            /// 全局允许访问
            ///  需要管理员权限
            /// </summary>
            public void AllowAccess()
            {
                SetPolicy(0x00000000);//全局允许
                SetSecurityItem("Allow");
                SetGlobalFlows(1);//全局通知
                SetPolicy(0x00000001);//全局打开
            }
            /// <summary>
            /// 全局禁止访问
            ///  需要管理员权限
            /// </summary>
            public void DenyAccess()
            {
                SetPolicy(0x00000000);//全局允许
                SetSecurityItem("Deny");
                SetGlobalFlows(0);//全局通知
                SetPolicy(0x00000002);//全局禁用
            }
    
            private RegistryKey LocalMachine => Environment.Is64BitOperatingSystem
                    ? RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
                        RegistryView.Registry64)
                    : Registry.LocalMachine;
    
    
            private RegistryKey CurrentUser => Environment.Is64BitOperatingSystem
                ? RegistryKey.OpenBaseKey(RegistryHive.CurrentUser,
                    RegistryView.Registry64)
                : Registry.CurrentUser;
    
            /// <summary>
            /// 设置全局策略
            /// </summary>
            /// <param name="letAppsAccessCameraValue"></param>
            private void SetPolicy(int letAppsAccessCameraValue)
            {
                using (RegistryKey key = LocalMachine.OpenSubKey(LetAppsAccessCamera, true))
                {
                    if (key == null)
                    {
                        key.CreateSubKey(LetAppsAccessCamera, RegistryKeyPermissionCheck.ReadWriteSubTree);
                        using (RegistryKey newKey = LocalMachine.OpenSubKey(LetAppsAccessCamera, true))
                        {
                            newKey.SetValue("value", letAppsAccessCameraValue, RegistryValueKind.DWord);
                        }
                        return;
                    }
                    key.SetValue("value", letAppsAccessCameraValue, RegistryValueKind.DWord);
                }
            }
            /// <summary>
            /// 全局通知
            /// </summary>
            /// <param name="globalParam"></param>
            private void SetGlobalFlows(int globalParam)
            {
                if (File.Exists(SystemSettingsAdminFlows))
                {
                    Process.Start(SystemSettingsAdminFlows, $"SetCamSystemGlobal webcam {globalParam}");
                }
            }
            /// <summary>
            /// 修改每一项
            /// </summary>
            /// <param name="webCamParam"></param>
            private void SetSecurityItem(string webCamParam)
            {
                using (RegistryKey key = CurrentUser.OpenSubKey(Webcam, true))
                {
                    if (key == null) return;
                    key.SetValue("Value", webCamParam);
                    foreach (var appKeyName in key.GetSubKeyNames())
                    {
                        if (string.IsNullOrWhiteSpace(appKeyName)) continue;
                        using (RegistryKey appKey = key.OpenSubKey(appKeyName, true))
                        {
                            if (appKey != null) appKey.SetValue("Value", webCamParam);
                        }
                    }
                }
            }
        }
    

      

     \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\default\Privacy 这个底下还有很多可以控制 比如麦克风,原理也是类似。
     
     
     
     
     
     
  • 相关阅读:
    ZOJ3626(树形dp)
    poj2486(树形dp)
    byte的范围-128-127
    div里面放img
    css为什么要定最小宽度和最大宽度,最小宽度和最大宽度有什么用
    Js中的apply和call
    Jquery点击事件出发顺序
    Jquery操作Dom
    Jquery选择器
    Django用ajax发送post请求时csrf拦截的解决方案
  • 原文地址:https://www.cnblogs.com/Koalin/p/16161023.html
Copyright © 2020-2023  润新知