PowerShell管理Hyper-V虚拟机学习笔记(一)

#新建虚拟机
#新建一个名称为Test 内存1G 硬盘大小为40Gb的一代Hyper-V虚拟机
$VM = New-VM –Name "Test" –MemoryStartupBytes 1GB -Generation 1 -NewVHDPath "D:\VM\Test.vhdx" -NewVHDSizeBytes 40GB
#设置虚拟机CPU为2核心
$VM | Set-VM -ProcessorCount 2 
#关闭虚脱机动态内存
$VM | Set-VMMemory -DynamicMemoryEnabled $False
#删除原有网卡
$VM | Remove-VMNetworkAdapter
#添加一个名称为 内网网卡 虚拟交换机为 VM_Lan 的网卡
$VM | Add-VMnetworkAdapter -Name "内网网卡" -SwitchName "VM_Lan"
#启用Vlan
$VM | Set-VMNetworkAdapterVlan –Access –VlanId 2
#添加一个名称为 外网网卡 虚拟交换机为 VM_Wan 的网卡
$VM | Add-VMnetworkAdapter -Name "外网网卡" -SwitchName "VM_Wan"


#查找已运行的虚拟机且名字包含Av_
$List = Get-VM | Where-Object {$_.State –eq 'Running'} | Where-Object {$_.Name -like 'AV_*'}

#启用联网网卡
foreach($I in $List) {
  Connect-VMNetworkAdapter -VMName $I.VMName -Name "外网网卡" -SwitchName "Wan"
}

#禁用联网网卡
foreach($I in $List) {
  Disconnect-VMNetworkAdapter -VMName $I.VMName -Name "外网网卡"
}

#删除所有已关机状态的虚拟机网卡
foreach($I in $List) {
    Remove-VMNetworkAdapter $I
}

#添加指定模式的双网卡
foreach($I in $List) {
    Add-VMnetworkAdapter $I -Name "内网网卡" -SwitchName "VM_Lan" 
    Set-VMNetworkAdapterVlan $I –Access –VlanId 2
    Add-VMnetworkAdapter $I -Name "外网网卡" -SwitchName "VM_Wan"
}

#启动虚拟机
$List = Get-VM | Where-Object {$_.State –eq 'Off'} | Where-Object {$_.Name -like 'AV_*'}
foreach($I in $List) {
    Start-VM -Name $I.VMName
}

#关闭虚拟机
$List = Get-VM | Where-Object {$_.State –eq 'Running'} | Where-Object {$_.Name -like 'AV_*'}
foreach($I in $List) {
    Stop-VM -Name $I.VMName
}


PEB For Delphi

Const
  GDI_HANDLE_BUFFER_SIZE32 = 34;
  GDI_HANDLE_BUFFER_SIZE64 = 60;
  FLS_MAXIMUM_AVAILABLE    = 128;
  FLS_MAXIMUM              =  FLS_MAXIMUM_AVAILABLE Div (SizeOf(ULONG) * 8);

Type
  UNICODE_STRING = Record
    Length        :USHORT;
    MaximumLength :USHORT;
    Buffer        :PWideChar;
  End;
  PUNICODE_STRING = ^UNICODE_STRING;

  ANSI_STRING = Record
    Length        :USHORT;
    MaximumLength :USHORT;
    Buffer        :PAnsiChar;
  End;

  _CURDIR = Record
    DosPath :UNICODE_STRING;
    Handle  :THandle;
  End;
  CURDIR  = _CURDIR;
  PCURDIR = ^_CURDIR;

  _RTL_DRIVE_LETTER_CURDIR = Record
    Flags     :USHORT;
    Length    :USHORT;
    TimeStamp :ULONG;
    DosPath   :ANSI_STRING;
  End;
  RTL_DRIVE_LETTER_CURDIR  = _RTL_DRIVE_LETTER_CURDIR;
  PRTL_DRIVE_LETTER_CURDIR = ^_RTL_DRIVE_LETTER_CURDIR;

  _PEB_LDR_DATA = Record
    Length                          :ULONG;
    Initialized                     :Boolean;
    SsHandle                        :THandle;
    InLoadOrderModuleList           :TListEntry;
    InMemoryOrderModuleList         :TListEntry;
    InInitializationOrderModuleList :TListEntry;
    EntryInProgress                 :Pointer;
    ShutdownInProgress              :Boolean;
    ShutdownThreadId                :THandle;
  End;
  TPEB_LDR_DATA = _PEB_LDR_DATA;
  PEB_LDR_DATA  = _PEB_LDR_DATA;
  PPEB_LDR_DATA = ^_PEB_LDR_DATA;

  _RTL_USER_PROCESS_PARAMETERS = Record
    MaximumLength      :ULONG;
    Length             :ULONG;
    Flags              :ULONG;
    DebugFlags         :ULONG;
    ConsoleHandle      :THandle;
    ConsoleFlags       :ULONG;
    StandardInput      :THandle;
    StandardOutput     :THandle;
    StandardError      :THandle;
    CurrentDirectory   :CURDIR;
    DllPath            :UNICODE_STRING;
    ImagePathName      :UNICODE_STRING;
    CommandLine        :UNICODE_STRING;
    Environment        :Pointer;
    StartingX          :ULONG;
    StartingY          :ULONG;
    CountX             :ULONG;
    CountY             :ULONG;
    CountCharsX        :ULONG;
    CountCharsY        :ULONG;
    FillAttribute      :ULONG;
    WindowFlags        :ULONG;
    ShowWindowFlags    :ULONG;
    WindowTitle        :UNICODE_STRING;
    DesktopInfo        :UNICODE_STRING;
    ShellInfo          :UNICODE_STRING;
    RuntimeData        :UNICODE_STRING;
    CurrentDirectories :Array [0..31] Of RTL_DRIVE_LETTER_CURDIR;
    EnvironmentSize    :ULONG;
    EnvironmentVersion :ULONG;
  End;
  RTL_USER_PROCESS_PARAMETERS  = _RTL_USER_PROCESS_PARAMETERS;
  TRTL_USER_PROCESS_PARAMETERS = _RTL_USER_PROCESS_PARAMETERS;
  PRTL_USER_PROCESS_PARAMETERS = ^_RTL_USER_PROCESS_PARAMETERS;

  PPS_POST_PROCESS_INIT_ROUTINE = Pointer;
  PRTL_CRITICAL_SECTION = PRTLCriticalSection;

  GDI_HANDLE_BUFFER32 = Array [0..GDI_HANDLE_BUFFER_SIZE32-1] Of ULONG;
  GDI_HANDLE_BUFFER64 = Array [0..GDI_HANDLE_BUFFER_SIZE64-1] Of ULONG;
  {$IFDEF WIN64}
  GDI_HANDLE_BUFFER = GDI_HANDLE_BUFFER64;
  {$ELSE}
  GDI_HANDLE_BUFFER = GDI_HANDLE_BUFFER32;
  {$ENDIF}

  _PEB = Record
    InheritedAddressSpace      :Boolean;
    ReadImageFileExecOptions   :Boolean;
    BeingDebugged              :Boolean;
    BitField                   :Boolean;
    Mutant                     :THandle;
    ImageBaseAddress           :Pointer;
    Ldr                        :PPEB_LDR_DATA;
    ProcessParameters          :PRTL_USER_PROCESS_PARAMETERS;
    SubSystemData              :Pointer;
    ProcessHeap                :Pointer;
    FastPebLock                :PRTL_CRITICAL_SECTION;
    AtlThunkSListPtr           :Pointer;
    IFEOKey                    :Pointer;
    CrossProcessFlags          :ULONG;
    EnvironmentUpdateCount     :ULONG;
    KernelCallbackTable        :Pointer;
    SystemReserved             :Array [0..0] Of ULONG;
    AtlThunkSListPtr32         :ULONG;
    ApiSetMap                  :Pointer;
    TlsExpansionCounter        :ULONG;
    TlsBitmap                  :Pointer;
    TlsBitmapBits              :Array [0..1] Of ULONG;
    ReadOnlySharedMemoryBase   :Pointer;
    HotpatchInformation        :Pointer;
    ReadOnlyStaticServerData   :PPointer;
    AnsiCodePageData           :Pointer;
    OemCodePageData            :Pointer;
    UnicodeCaseTableData       :Pointer;
    NumberOfProcessors         :ULONG;
    NtGlobalFlag               :ULONG;
    CriticalSectionTimeout     :LARGE_INTEGER;
    HeapSegmentReserve         :SIZE_T;
    HeapSegmentCommit          :SIZE_T;
    HeapDeCommitTotalFreeThreshold   :SIZE_T;
    HeapDeCommitFreeBlockThreshold   :SIZE_T;
    NumberOfHeaps              :ULONG;
    MaximumNumberOfHeaps       :ULONG;
    ProcessHeaps               :PPointer;
    GdiSharedHandleTable       :Pointer;
    ProcessStarterHelper       :Pointer;
    GdiDCAttributeList         :ULONG;
    LoaderLock                 :PRTL_CRITICAL_SECTION;
    OSMajorVersion             :ULONG;
    OSMinorVersion             :ULONG;
    OSBuildNumber              :USHORT;
    OSCSDVersion               :USHORT;
    OSPlatformId               :ULONG;
    ImageSubsystem             :ULONG;
    ImageSubsystemMajorVersion :ULONG;
    ImageSubsystemMinorVersion :ULONG;
    ImageProcessAffinityMask   :ULONG_PTR;
    GdiHandleBuffer            :GDI_HANDLE_BUFFER;
    PostProcessInitRoutine     :Pointer;
    TlsExpansionBitmap         :Pointer;
    TlsExpansionBitmapBits     :Array [0..31] Of ULONG;
    SessionId                  :ULONG;
    AppCompatFlags             :ULARGE_INTEGER;
    AppCompatFlagsUser         :ULARGE_INTEGER;
    pShimData                  :Pointer;
    AppCompatInfo              :Pointer;
    CSDVersion                 :UNICODE_STRING;
    ActivationContextData      :Pointer;
    ProcessAssemblyStorageMap  :Pointer;
    SystemDefaultActivationContextData  :Pointer;
    SystemAssemblyStorageMap   :Pointer;
    MinimumStackCommit         :SIZE_T;
    FlsCallback                :PPointer;
    FlsListHead                :TListEntry;
    FlsBitmap                  :Pointer;
    FlsBitmapBits              :Array [0..FLS_MAXIMUM-1] Of ULONG;
    FlsHighIndex               :ULONG;
    WerRegistrationData        :Pointer;
    WerShipAssertPtr           :Pointer;
    pContextData               :Pointer;
    pImageHeaderHash           :Pointer;
    TracingFlags               :ULONG;
    SpareTracingBits           :ULONG;
  End;
  TPEB = _PEB;
  PPEB = ^_PEB;

  _LDR_DATA_TABLE_ENTRY_COMPATIBLE = Record
    InLoadOrderLinks           :TListEntry;
    InMemoryOrderLinks         :TListEntry;
    InInitializationOrderLinks :TListEntry;
    DllBase                    :Pointer;
    EntryPoint                 :Pointer;
    SizeOfImage                :ULONG;
    FullDllName                :UNICODE_STRING;
    BaseDllName                :UNICODE_STRING;
    Flags                      :ULONG;
    ObsoleteLoadCount          :Word;
    TlsIndex                   :Word;
    HashLinks                  :TListEntry;
    TimeDateStamp              :ULONG;
  End;
  LDR_DATA_TABLE_ENTRY_COMPATIBLE = _LDR_DATA_TABLE_ENTRY_COMPATIBLE;
  LDR_DATA_TABLE_ENTRY = _LDR_DATA_TABLE_ENTRY_COMPATIBLE;
  PLDR_DATA_TABLE_ENTRY = ^_LDR_DATA_TABLE_ENTRY_COMPATIBLE;
  LdrModule  = _LDR_DATA_TABLE_ENTRY_COMPATIBLE;
  PLdrModule = ^LdrModule;


ListView高速添加数据

Type //定义个
  PFileListItem = ^TFileListItem;
  TFileListItem = Record
    szName :String;
    szSize :String;
  End;

Var //来个变量
  FFileItemList  :TList;

Procedure ClearItemList();
Var //清空链表
  I :Integer;
begin
  For I := 0 to FFileItemList.Count-1 do
  begin //释放New出来的内存但是注意 Dispose不会直接把内存还给系统而且等待下一次New调用
    Dispose(PFileListItem(FFileItemList[I]));
  end;
  FFileItemList.Clear;
end;

//添加 ListView Data事件 并将ListView的 OwnerData 属性设置为 True
Procedure TForm.ListViewData(Sender: TObject; Item: TListItem);
begin
  With PFileListItem(FFileItemList[Item.Index])^ do
  begin
    Item.Caption := szName;
    Item.SubItems.Add(szSize);
  end;
end;

//添加数据的时候

Var
  pFileItem  :PFileListItem;
  I          :Integer;
Begin
  ClearItemList();
  
  LockWindowUpdate(ListView.Handle); //通过句柄锁住ListView防止刷新
  
  For I := 0 To 102400 Do
  Begin
    pFileItem := New(PFileListItem);
    pFileItem.szName := '这是文件名';
    pFileItem.szSize := '1024Kb';
    
    FFileItemList.Add(pFileItem); //添加到链表
  End;
  
  ListView_File.Items.Count := FFileItemList.Count;

  LockWindowUpdate(0); //解锁
End;


Delphi 获取系统版本{2K~10}

Function RtlGetVersion(Var lpOsInfo :TOSVersionInfoExW):DWORD; Stdcall; External 'ntdll.dll';
//GetVersionEx 在Win8以后的的版本会以兼容模式来获取结果导致获取到的NT内核版本都是6.2所以这里用RtlGetVersion
Function GetOs():Byte;
  Const
    SM_SERVERR2 = 89;
Var
  OSINFO: TOSVersionInfoExW;
begin
  Result := 255;
  OSINFO.dwOSVersionInfoSize := SizeOf(TOSVersionInfoExW);
  if RtlGetVersion(OSINFO) = 0 then
  begin
    if (OSINFO.dwMajorVersion = 5) and (OSINFO.dwMinorVersion = 0) then
      Result := 1//'Windows 2000'
    else if (OSINFO.dwMajorVersion = 5) and (OSINFO.dwMinorVersion = 1) then
      Result := 2//'Windows XP'
    else if (OSINFO.dwMajorVersion = 5) and (OSINFO.dwMinorVersion = 2) and (GetSystemMetrics(SM_SERVERR2) = 0) then
      Result := 3//'Windows Server 2003'
    else if (OSINFO.dwMajorVersion = 5) and (OSINFO.dwMinorVersion = 2) and (GetSystemMetrics(SM_SERVERR2) <> 0) then
      Result := 4//'Windows Server 2003 R2'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 0) and (OSINFO.wProductType = VER_NT_WORKSTATION) then
      Result := 5//'Windows Vista'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 0) and (OSINFO.wProductType <> VER_NT_WORKSTATION) then
      Result := 6//'Windows Server 2008'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 1) and (OSINFO.wProductType <> VER_NT_WORKSTATION) then
      Result := 7//'Windows Server 2008 R2'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 1) and (OSINFO.wProductType = VER_NT_WORKSTATION) then
      Result := 8//'Windows 7'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 2) and (OSINFO.wProductType = VER_NT_WORKSTATION) then
      Result := 9//'Windows 8'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 2) and (OSINFO.wProductType <> VER_NT_WORKSTATION) then
      Result := 10//'Windows Server 2012'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 3) and (OSINFO.wProductType = VER_NT_WORKSTATION) then
      Result := 11//'Windows 8.1'
    else if (OSINFO.dwMajorVersion = 6) and (OSINFO.dwMinorVersion = 3) and (OSINFO.wProductType <> VER_NT_WORKSTATION) then
      Result := 12//'Windows Server 2012 R2'
    else if (OSINFO.dwMajorVersion = 10) and (OSINFO.dwMinorVersion = 0) and (OSINFO.wProductType = VER_NT_WORKSTATION) then
      Result := 13//'Windows 10'
    else if (OSINFO.dwMajorVersion = 10) and (OSINFO.dwMinorVersion = 0) and (OSINFO.wProductType <> VER_NT_WORKSTATION) then
      Result := 14//'Windows Server 2016 Technical Preview'
    else
      Result := 255;
  end;
end;