Как я могу использовать скрипт, чтобы вывести удаленный компьютер из спящего режима? - PullRequest
0 голосов
/ 24 октября 2019

Мы пытаемся создать скрипт, который сообщает списку компьютеров, чтобы они не спали.

Я ходил по магазинам и решил пойти с одним, который, я думаю, нашел здесь, но я не могу заставить его работать на удаленной системе. Я пытался invoke-command до этого, затем -filepath к сценарию и указывал имя компьютера, но это ничего не делает. Что я делаю не так?

function workflow-Scrollock {
  Clear-Host
  Echo "Keep-alive with Scroll Lock..."
  $WShell = New-Object -com "Wscript.Shell"
  while ($true)
  {
    $WShell.sendkeys("{CAPSLOCK}")
    Start-Sleep -Milliseconds 2000
    $WShell.sendkeys("{CAPSLOCK}")
    Start-Sleep -Seconds 2
  }
}

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

1 Ответ

0 голосов
/ 24 октября 2019

До тех пор, пока ваша основная цель состоит в том, чтобы держать бодрствующий компьютер (а не мигать клавишей Caps Lock), этот ответ на связанный вопрос должен помочь. По сути, вам просто нужно вбить весь этот C # в Add-Type с несколькими модификациями, например:

Add-Type -TypeDefinition @"
    using System;
    using System.Net;
    using System.Runtime.InteropServices;

    public class PowerManager {
        POWER_REQUEST_CONTEXT _PowerRequestContext;
        IntPtr _PowerRequest; // HANDLE

        // Availability Request Functions
        [DllImport("kernel32.dll")]
        static extern IntPtr PowerCreateRequest(ref POWER_REQUEST_CONTEXT Context);

        [DllImport("kernel32.dll")]
        static extern bool PowerSetRequest(IntPtr PowerRequestHandle, PowerRequestType RequestType);

        [DllImport("kernel32.dll")]
        static extern bool PowerClearRequest(IntPtr PowerRequestHandle, PowerRequestType RequestType);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
        internal static extern int CloseHandle(IntPtr hObject);

        // Availablity Request Enumerations and Constants
        enum PowerRequestType
        {
            PowerRequestDisplayRequired = 0,
            PowerRequestSystemRequired,
            PowerRequestAwayModeRequired,
            PowerRequestMaximum
        }

        const int POWER_REQUEST_CONTEXT_VERSION = 0;
        const int POWER_REQUEST_CONTEXT_SIMPLE_STRING = 0x1;
        const int POWER_REQUEST_CONTEXT_DETAILED_STRING = 0x2;

        // Availablity Request Structure
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public struct POWER_REQUEST_CONTEXT
        {
            public UInt32 Version;
            public UInt32 Flags;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string SimpleReasonString;
        }

        public void EnableConstantDisplayAndPower(bool enable, string reason)
        {
            if (enable)
            {
                // Set up the diagnostic string
                _PowerRequestContext.Version = POWER_REQUEST_CONTEXT_VERSION;
                _PowerRequestContext.Flags = POWER_REQUEST_CONTEXT_SIMPLE_STRING;
                _PowerRequestContext.SimpleReasonString = reason; // your reason for changing the power settings

                // Create the request, get a handle
                _PowerRequest = PowerCreateRequest(ref _PowerRequestContext);

                // Set the request
                PowerSetRequest(_PowerRequest, PowerRequestType.PowerRequestSystemRequired);
                PowerSetRequest(_PowerRequest, PowerRequestType.PowerRequestDisplayRequired);
            }
            else
            {
                // Clear the request
                PowerClearRequest(_PowerRequest, PowerRequestType.PowerRequestSystemRequired);
                PowerClearRequest(_PowerRequest, PowerRequestType.PowerRequestDisplayRequired);

                CloseHandle(_PowerRequest);
            }
        }
    }
"@
(New-Object PowerManager).EnableConstantDisplayAndPower($true, "Keeping the computer awake")
Wait-Event

Я немного убрал его, чтобы удалить некоторые неиспользуемые вещи и превратить в класс, затем добавилWait-Event чтобы он продолжал работать.

Теперь вам просто нужно выполнить его удаленно:

Invoke-Command -AsJob -ComputerName remotecomputer -FilePath C:\Path\To\Set-KeepAwake.ps1

Вы можете доказать, что он работает, проверив powercfg /requests:

Invoke-Command -ComputerName remotecomputer -ScriptBlock { powercfg /requests }

Какие выходы:

DISPLAY:
None.

SYSTEM:
[PROCESS] \Device\HarddiskVolume1\Windows\System32\wsmprovhost.exe
Keeping the computer awake

AWAYMODE:
None.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...