TransWikia.com

Как запустить из Net Framework программы типа брандмауэр, электропитание?

Stack Overflow на русском Asked by Anonim on November 15, 2021

Эти программы не имеют своих .exe файлов, а являются частью explorer, потому не ясны аргументы для программ этих вызовов.

2 Answers

В дополнение, элементы панели управления можно запустить по их пути в Shell Namespace, например так для электропитания:

%systemroot%explorer.exe "::{26EE0668-A00A-44D7-9371-BEB064C98683}::{025A5937-A6BE-4686-A844-36FE4BEC8B6D}"

Путь можно получить с помощью Shell API:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApp1
{
    public struct ShellItem
    {
        public string DisplayName { get; set; }
        public string Path { get; set; }
    }

    class Program
    {
        public const uint SHGFI_DISPLAYNAME = 0x000000200;
        public const uint SHGFI_ICON = 0x000000100;
        public const uint SHGFI_PIDL = 0x000000008;
        public const uint GIL_FORSHELL = 0x0002;
        public const int SHGDN_NORMAL = 0x0000;
        public const int SHGDN_FORPARSING = 0x8000;
        public const int SHCONTF_FOLDERS = 0x0020;
        public const int SHCONTF_NONFOLDERS = 0x0040;

        [DllImport("shell32.dll")]
        public static extern int SHGetKnownFolderIDList(ref Guid rfid, int dwFlags, IntPtr hToken, out IntPtr ppidl);

        [DllImport("ole32.dll")]
        public static extern void CoTaskMemFree(IntPtr pv);

        [DllImport("shell32.dll")]
        public static extern int SHBindToObject(
            IShellFolder psf,
            IntPtr pidl,
            [MarshalAs(UnmanagedType.IUnknown)] object pbc,
            ref Guid riid,
            out IShellFolder ppv);

        [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
        public static extern int StrRetToStr(ref STRRET pstr, IntPtr pidl, out IntPtr ppsz);

        [DllImport("user32.dll")]
        public static extern bool DestroyIcon(IntPtr hIcon);


        /* COM Interfaces */

        [ComImport]
        [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        [Guid("000214E6-0000-0000-C000-000000000046")]
        public interface IShellFolder
        {
            void ParseDisplayName(IntPtr hwnd, IntPtr pbc, String pszDisplayName, UInt32 pchEaten, out IntPtr ppidl, UInt32 pdwAttributes);
            void EnumObjects(IntPtr hwnd, int grfFlags, out IEnumIDList ppenumIDList);
            void BindToObject(IntPtr pidl, IntPtr pbc, [In]ref Guid riid, out IntPtr ppv);
            void BindToStorage(IntPtr pidl, IntPtr pbc, [In]ref Guid riid, out IntPtr ppv);
            [PreserveSig]
            Int32 CompareIDs(Int32 lParam, IntPtr pidl1, IntPtr pidl2);
            void CreateViewObject(IntPtr hwndOwner, [In] ref Guid riid, out IntPtr ppv);
            void GetAttributesOf(UInt32 cidl, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)]IntPtr[] apidl, ref uint rgfInOut);
            void GetUIObjectOf(IntPtr hwndOwner, UInt32 cidl, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]IntPtr[] apidl,
                [In] ref Guid riid, UInt32 rgfReserved, out IExtractIcon ppv);
            void GetDisplayNameOf(IntPtr pidl, int uFlags, out STRRET pName);
            void SetNameOf(IntPtr hwnd, IntPtr pidl, String pszName, int uFlags, out IntPtr ppidlOut);
        }

        [StructLayout(LayoutKind.Explicit, Size = 520)]
        public struct STRRETinternal
        {
            [FieldOffset(0)]
            public IntPtr pOleStr;

            [FieldOffset(0)]
            public IntPtr pStr;

            [FieldOffset(0)]
            public uint uOffset;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct STRRET
        {
            public uint uType;
            public STRRETinternal data;
        }

        [ComImport]
        [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        [Guid("000214F2-0000-0000-C000-000000000046")]
        public interface IEnumIDList
        {
            [PreserveSig()]
            uint Next(uint celt, out IntPtr rgelt, IntPtr pceltFetched);
            [PreserveSig()]
            uint Skip(uint celt);
            [PreserveSig()]
            uint Reset();
            [PreserveSig()]
            uint Clone(out IEnumIDList ppenum);
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public struct SHFILEINFO
        {
            public IntPtr hIcon;
            public int iIcon;
            public uint dwAttributes;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string szDisplayName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szTypeName;
        }

        [ComImport()]
        [Guid("000214fa-0000-0000-c000-000000000046")]
        [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IExtractIcon
        {
            [PreserveSig]
            int GetIconLocation(
                uint uFlags,
                [Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 2)] StringBuilder szIconFile,
                int cchMax,
                out int piIndex,
                out uint pwFlags);


            [PreserveSig]
            int Extract(
                [MarshalAs(UnmanagedType.LPWStr)] string pszFile, uint nIconIndex, out IntPtr phiconLarge,
                out IntPtr phiconSmall, uint nIconSize);
        }                

        public static List<ShellItem> GetItems(Guid FolderID) //Получает список элементов каталога по GUID
        {
            IntPtr p = IntPtr.Zero;
            IShellFolder pFolder = null;
            IEnumIDList pEnum = null;
            IntPtr pItem = IntPtr.Zero;
            IntPtr lpStr = IntPtr.Zero;
            STRRET strret;
            Guid guid = typeof(IShellFolder).GUID;
            List<ShellItem> items = new List<ShellItem>();
            ShellItem si;

            try
            {
                int hr = SHGetKnownFolderIDList(ref FolderID, 0, IntPtr.Zero, out p);
                if (hr != 0) throw Marshal.GetExceptionForHR(hr);

                hr = SHBindToObject(null, p, null, ref guid, out pFolder);
                if (hr != 0) throw Marshal.GetExceptionForHR(hr);

                pFolder.EnumObjects(IntPtr.Zero, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, out pEnum);

                while (true)
                {
                    string s;
                    pItem = IntPtr.Zero;
                    uint res = pEnum.Next(1, out pItem, IntPtr.Zero);
                    if (res != 0) break;
                    si = new ShellItem();

                    //display name
                    try
                    {
                        lpStr = IntPtr.Zero;
                        strret = new STRRET();

                        pFolder.GetDisplayNameOf(pItem, SHGDN_NORMAL, out strret);

                        hr = StrRetToStr(ref strret, pItem, out lpStr);
                        if (hr != 0) throw Marshal.GetExceptionForHR(hr);

                        s = Marshal.PtrToStringUni(lpStr);
                        si.DisplayName = s;
                        CoTaskMemFree(lpStr);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.ToString());
                    }

                    //path
                    lpStr = IntPtr.Zero;
                    strret = new STRRET();
                    pFolder.GetDisplayNameOf(pItem, SHGDN_FORPARSING, out strret);
                    hr = StrRetToStr(ref strret, pItem, out lpStr);
                    if (hr != 0) throw Marshal.GetExceptionForHR(hr);
                    s = Marshal.PtrToStringUni(lpStr);
                    si.Path = s;
                    CoTaskMemFree(lpStr);

                    items.Add(si);
                    CoTaskMemFree(pItem);
                }
            }

            finally
            {
                if (p != IntPtr.Zero) CoTaskMemFree(p);
                if (pFolder != null) Marshal.ReleaseComObject(pFolder);
                if (pEnum != null) Marshal.ReleaseComObject(pEnum);
            }
            return items;
        }
        
        static void Main(string[] args)
        {
            var list = GetItems(Guid.Parse("82A74AEB-AEB4-465C-A014-D097EE346D63"));//Панель управления

            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine("{0} {1}", list[i].DisplayName, list[i].Path);
            }

            Console.ReadKey();
        }
    }

}

Результат:

Электропитание ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{025A5937-A6BE-4686-A844-36FE4BEC8B6D}
Панель задач и навигация ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{0DF44EAA-FF21-4412-828E-260A8728E7F1}
Диспетчер учетных данных ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{1206F5F1-0569-412C-8FEC-3204630DFB70}
Программы по умолчанию ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{17CD9488-1228-4B2F-88CE-4298E93E0966}
Подключения к удаленным рабочим столам и приложениям RemoteApp ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{241D7C96-F8BF-4F85-B01F-E2B043341A4B}
Брандмауэр Защитника Windows ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{4026492F-2F69-46B8-B9BF-5654FC07E423}
Телефон и модем ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{40419485-C444-4567-851A-2DD7BFA1684D}
Распознавание речи ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{58E3C745-D971-4081-9034-86E34B30836A}
Учетные записи пользователей ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{60632754-C523-4B62-B45C-4172DA012619}
Региональные стандарты ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{62D8ED13-C9D0-4CE8-A914-47DD628FB1B0}
Мышь ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{6C8EEC18-8D75-41B2-A177-8831D59D2D50}
Параметры Проводника ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{6DFD7C5C-2451-11D3-A299-00C04F8EF6AF}
Клавиатура ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{725BE8F7-668E-4C7B-8F90-46BDB0936430}
Диспетчер устройств ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{74246BFC-4C96-11D0-ABEF-0020AF6B0B7A}
Программы и компоненты ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}
Параметры индексирования ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{87D66A43-7B11-4A28-9811-C86EE395ACF7}
Windows To Go ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{8E0C279D-0BD1-43C3-9EBD-31C3DC5B8A77}
Центр управления сетями и общим доступом ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{8E908FC9-BECC-40F6-915B-F4CA0E70D03D}
Автозапуск ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{9C60DE1E-E5FC-40F4-A487-460851A8D915}
Центр синхронизации ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{9C73F5E5-7AE7-4E32-A8E8-8D23B85255BF}
Восстановление ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{9FE63AFD-59CF-4419-9775-ABCC3849F861}
Свойства браузера ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{A3DD4F92-658A-410F-84FD-6FBBBEF2FFFE}
Устройства и принтеры ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{A8A91A66-3A7D-4424-8D24-04E180695C7A}
Управление цветом ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{B2C761C6-29BC-4F19-9251-E6195265BAF1}
Резервное копирование и восстановление (Windows 7) ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{B98A2BEA-7D42-4558-8BD1-832F41BAC6FD}
Система ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{BB06C0E4-D293-4F75-8A90-CB05B6477EEE}
Центр безопасности и обслуживания ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{BB64F8A7-BEE7-4E1A-AB8D-7D8273F7FDB6}
Шрифты ::{26EE0668-A00A-44D7-9371-BEB064C98683}Шрифты
Устранение неполадок ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{C58C4893-3BE0-4B45-ABB5-A63E4B8C8651}
Центр специальных возможностей   ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{D555645E-D4F8-4C29-A827-D93C859C4F2A}
Шифрование диска BitLocker ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{D9EF8727-CAC2-4E60-809E-86F80A666C91}
Дата и время ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{E2E7934B-DCE5-43C4-9576-7FE4F75E7480}
Рабочие папки ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{ECDB0924-4208-451E-8EE0-373C0956DE16}
Звук ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{F2DDFC82-8F12-4CDD-B7DC-D4FE1425AA4D}
История файлов ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{F6B6E965-E9B2-444B-9286-10C9152EDBC5}
Дисковые пространства ::{26EE0668-A00A-44D7-9371-BEB064C98683}::{F942C606-0914-47AB-BE56-1321B8035096}

Answered by MSDN.WhiteKnight on November 15, 2021

Через командную строку можно вызвать их с помощью команд powercfg.cpl и firewall.cpl. Программно можете попробовать вызывать их напрямую в Process.Start, либо вызывать explorer.exe или cmd.exe, а вышеуказанные команды передать в аргументы вызова процесса.

Answered by 4per on November 15, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP