• Как получить список всех заголовков окон на удаленном ПК?

    stxtasy
    @stxtasy Автор вопроса
    Вот нарыл скрипт написанный на C# и интегрированный в PS который делает ровно тоже-самое только средствами .net (проверил у себя, работает выдает список заголовков окон).
    Может быть его получится прикрутить к удаленному ПК ? Я попробовал просто через Invoke-Command - пустота )

    $def = @"
    using System;
    using System.Runtime.InteropServices;
    using System.Collections.Generic;
    using System.Text; 
    
    namespace pinvoke {
        public enum GetWindow_Cmd : uint {
            GW_HWNDFIRST = 0,
            GW_HWNDLAST = 1,
            GW_HWNDNEXT = 2,
            GW_HWNDPREV = 3,
            GW_OWNER = 4,
            GW_CHILD = 5,
            GW_ENABLEDPOPUP = 6
        }
        
        public class User32 {
            // ***** Unmanaged DLL Access *****
            private class unmanaged {
                // EnumWindows
                [DllImport("user32.dll")]
                [return: MarshalAs(UnmanagedType.Bool)]
                internal static extern bool EnumWindows(EnumWindowsProcD lpEnumFunc, ref IntPtr lParam);
        
                // GetWindow
                [DllImport("user32.dll", SetLastError = true)]
                internal static extern IntPtr GetWindow(IntPtr hWnd, GetWindow_Cmd uCmd);
            
                // GetWindowText
                [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
                internal static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
    
                // GetWindowTextLength
                [DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
                internal static extern int GetWindowTextLength(IntPtr hWnd);
    
                // IsWindowEnabled
                [DllImport("user32.dll", SetLastError=true)]
                [return: MarshalAs(UnmanagedType.Bool)]
                internal static extern bool IsWindowEnabled(IntPtr hWnd);
    
                // IsWindowVisible
                [DllImport("user32.dll")]
                internal static extern bool IsWindowVisible(IntPtr hWnd);
    
            }
    
            // ***** Callback function delegates *****
            private delegate bool EnumWindowsProcD(IntPtr hWnd, ref IntPtr lItems);       
    
            // ***** Callback function for EnumChildWindows and EnumWindows *****
            private static bool EnumWindowsProc(IntPtr hWnd, ref IntPtr lItems) {
                if(hWnd != IntPtr.Zero) {
                    GCHandle hItems = GCHandle.FromIntPtr(lItems);
                    List<IntPtr> items = hItems.Target as List<IntPtr>;
                    items.Add(hWnd);
                    return true;
                } else {
                    return false;
                }
            }
    
            // ***** Functions *****
            // EnumWindows
            public static List<IntPtr> EnumWindows() {
                try {
                    List<IntPtr> items = new List<IntPtr>();
                    EnumWindowsProcD CallBackPtr = new EnumWindowsProcD(User32.EnumWindowsProc);
                    GCHandle hItems = GCHandle.Alloc(items);
                    IntPtr lItems = GCHandle.ToIntPtr(hItems);
                    unmanaged.EnumWindows(CallBackPtr, ref lItems);
                    return items;
                } catch (Exception ex) {
                    throw new Exception("An Error has occured during enumeration: " + ex.Message);
                }
            }
            
            // GetWindowText
            public static string GetWindowText(IntPtr hWnd) {
                int iTextLength = unmanaged.GetWindowTextLength(hWnd);
                if(iTextLength > 0) {
                    StringBuilder sb = new StringBuilder(iTextLength);
                    unmanaged.GetWindowText(hWnd, sb, iTextLength + 1);
                    return sb.ToString();
                } else {
                    return String.Empty;
                }
            }
    
            // IsWindowEnabled
            public static bool IsWindowEnabled(IntPtr hWnd) {
                return IsWindowEnabled(hWnd);
           }
    
            // IsWindowVisible
            public static bool IsWindowVisible(IntPtr hWnd) {
                return unmanaged.IsWindowVisible(hWnd);
            }
        }
    }
    "@
    
    if(-not ([System.Management.Automation.PSTypeName]"pinvoke.user32").Type) {
        Add-Type -TypeDefinition $def
    } 
    
    Write-Output ([pinvoke.User32]::EnumWindows() | Where-Object {
        [pinvoke.User32]::IsWindowVisible($_)
        } | ForEach-Object {
            [pinvoke.User32]::GetWindowText($_) 
        } | Where-Object {
            $_ -notlike [String]::Empty
        })
  • Как получить список всех заголовков окон на удаленном ПК?

    stxtasy
    @stxtasy Автор вопроса
    Да вы правы, получение заголовка окна на удаленном компьютере не поддерживается, вот тут это написано NotSupportedException
    https://msdn.microsoft.com/ru-ru/%D0%B3%D1%8B-it/l...

    Думаю какие бы придумать обходные пути...

    UPD: тут предлагают использовать PsExec, ну видимо единственный вариант https://www.reddit.com/r/PowerShell/comments/2onpd...
  • Как получить список всех заголовков окон на удаленном ПК?

    stxtasy
    @stxtasy Автор вопроса
    Не могли бы вы подсказать что именно вы имели ввиду ? Чтобы удаленно передавались значения нужно внести какие-то дополнительные настройки ?