提问人:Subhi Shawa 提问时间:4/6/2022 更新时间:4/6/2022 访问量:253
Powershell:找不到定义的类类型
Powershell: Unable to find type of class defined
问:
我正在尝试使用远程计算机的 Powershell 更改屏幕分辨率。 在线搜索,找到了 PS-ChangeDisplayresolution,有人能够在 Powershell 中使用 C# 执行此操作,在我的本地计算机上运行脚本,它工作得很好,但远程运行它,然后它不起作用。 我正在寻找远程运行它的方法,偶然发现了 Start-Process 和 Invoke-Command。但是,在本地尝试时,我收到错误 无法找到类型。
将不胜感激。
$command = {
$width = 1152
$height = 864
$freq = 64
#Function to update the screen resolution
Function Set-ScreenResolution {
$pinvokeCode = @'
using System;
using System.Runtime.InteropServices;
namespace Resolution
{
[StructLayout(LayoutKind.Sequential)]
public struct DEVMODE1
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string dmDeviceName;
public short dmSpecVersion;
public short dmDriverVersion;
public short dmSize;
public short dmDriverExtra;
public int dmFields;
public short dmOrientation;
public short dmPaperSize;
public short dmPaperLength;
public short dmPaperWidth;
public short dmScale;
public short dmCopies;
public short dmDefaultSource;
public short dmPrintQuality;
public short dmColor;
public short dmDuplex;
public short dmYResolution;
public short dmTTOption;
public short dmCollate;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string dmFormName;
public short dmLogPixels;
public short dmBitsPerPel;
public int dmPelsWidth;
public int dmPelsHeight;
public int dmDisplayFlags;
public int dmDisplayFrequency;
public int dmICMMethod;
public int dmICMIntent;
public int dmMediaType;
public int dmDitherType;
public int dmReserved1;
public int dmReserved2;
public int dmPanningWidth;
public int dmPanningHeight;
};
class User_32
{
[DllImport("user32.dll")]
public static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE1 devMode);
[DllImport("user32.dll")]
public static extern int ChangeDisplaySettings(ref DEVMODE1 devMode, int flags);
public const int ENUM_CURRENT_SETTINGS = -1;
public const int CDS_UPDATEREGISTRY = 0x01;
public const int CDS_TEST = 0x02;
public const int DISP_CHANGE_SUCCESSFUL = 0;
public const int DISP_CHANGE_RESTART = 1;
public const int DISP_CHANGE_FAILED = -1;
}
public class PrmaryScreenResolution
{
static public string ChangeResolution(int width, int height, int freq)
{
DEVMODE1 dm = GetDevMode1();
if (0 != User_32.EnumDisplaySettings(null, User_32.ENUM_CURRENT_SETTINGS, ref dm))
{
dm.dmPelsWidth = width;
dm.dmPelsHeight = height;
dm.dmDisplayFrequency = freq;
int iRet = User_32.ChangeDisplaySettings(ref dm, User_32.CDS_TEST);
if (iRet == User_32.DISP_CHANGE_FAILED)
{
$retval = "Unable to process your request. Sorry for this inconvenience.";
}
else
{
iRet = User_32.ChangeDisplaySettings(ref dm, User_32.CDS_UPDATEREGISTRY);
switch (iRet)
{
case User_32.DISP_CHANGE_SUCCESSFUL:
{
$retval = "Success";
}
case User_32.DISP_CHANGE_RESTART:
{
$retval = "You need to reboot for the change to happen.\n If you feel any problems after rebooting your machine\nThen try to change resolution in Safe Mode.";
}
default:
{
$retval = "Failed to change the resolution";
}
}
}
}
else
{
$retval = "Failed to change the resolution.";
}
}
private static DEVMODE1 GetDevMode1()
{
DEVMODE1 dm = new DEVMODE1();
dm.dmDeviceName = new String(new char[32]);
dm.dmFormName = new String(new char[32]);
dm.dmSize = (short)Marshal.SizeOf(dm);
return dm;
}
}
}
'@
[Resolution.PrmaryScreenResolution]::ChangeResolution($width,$height,$freq)
}
#Call the function to change the resolution with the inserted parameters
$Test = Set-ScreenResolution -Width $width -Height $height -Freq $freq
}
Start-Process Powershell.exe -ArgumentList "-NoExit -command (invoke-command - scriptblock {$command})"
}
答: 暂无答案
评论
C#
PowerShell
$pinvokeCode
$retval = "Success";
C#
Add-Type -TypeDefinition $pinvokeCode
Add-Type -TypeDefinition $pinvokeCode
Unable to find type [Resolution.PrmaryScreenResolution].