none
Powershell. Узнать дату установки устройства RRS feed

  • Вопрос

  • Здравствуйте!

    Нужно узнать дату установки принтеров на сервере. 

    Get-WmiObject -Class Win32_PNPEntity

    Выдает список устройств, но свойство InstallDate у всех пустое. Хотя если зайти в свойства оборудования через графический интерфейс - дата установки отображается корректно. Цель - получить эту дату для нескольких объектов. В свойства каждого заходить очень долго.

    4 апреля 2017 г. 18:18

Ответы

  • Скачать модуль Device Management PowerShell Cmdlets .

    Типы классов устройств задается параметром -DeviceClass у командлета  Get-Device. Какие значения принимает данный параметр.

    [Enum]::GetNames([DeviceManager.Engine.DeviceClass]) -match "Print"
    GUID_DEVCLASS_DOT4PRINT
    GUID_DEVCLASS_PNPPRINTERS
    GUID_DEVCLASS_PRINTER
    GUID_DEVCLASS_PRINTERUPGRADE

    Для примера:

    PS (STA) > Get-Device -DeviceClass GUID_DEVCLASS_PRINTER | Select Name,DriverDescription,DriverVersion
    
    Name                                           DriverDescription                              DriverVersion
    ----                                           -----------------                              -------------
    Kyocera Monochrome Personal KPSL Class Driver  Kyocera Monochrome Personal KPSL Class Driver  10.0.14393.0

    И дата:

    PS (STA) > Get-Device -DeviceClass GUID_DEVCLASS_PRINTER | % {new-object psobject -prop $_.AvailableProperties} | Select *date*
    
    DEVPKEY_Device_InstallDate DEVPKEY_Device_FirstInstallDate DEVPKEY_Device_LastArrivalDate DEVPKEY_Device_DriverDate
    -------------------------- ------------------------------- ------------------------------ -------------------------
    9/21/2016 5:36:27 PM       9/21/2016 5:36:27 PM            3/31/2017 3:49:09 PM           4/21/2009 4:00:00 AM

    • Предложено в качестве ответа Dmitriy Razbornov 5 апреля 2017 г. 6:44
    • Помечено в качестве ответа Arkhipov Alexandr 5 апреля 2017 г. 12:56
    5 апреля 2017 г. 6:33
    Отвечающий
  • Спасибо за наводку, сделал с помощью модуля Device Management PowerShell Cmdlets.

    Вариант, выдающий название принтера и дату установки получился таким:

    $result = @();
    Get-Device -DeviceClass GUID_DEVCLASS_PRINTER |sort Name| ForEach-Object {
    $result += New-Object psobject -Property @{Name = $_.Name
                                               InstallDate =  (new-object psobject -prop $_.AvailableProperties|Select DEVPKEY_Device_FirstInstallDate).DEVPKEY_Device_FirstInstallDate|Get-Date -Format d}
    }
    $result |ft Name, InstallDate
    

    Однако на сервере печати 2012 R2 он выдает пустой результат. Пришлось переделать таким образом:

    $result = @();
    Get-Device |where {$_.DeviceParent -eq "SWD\PRINTENUM\PrintQueues"}|sort Name | ForEach-Object {
    $result += New-Object psobject -Property @{Name = $_.Name
                                               InstallDate =  (new-object psobject -prop $_.AvailableProperties|Select DEVPKEY_Device_FirstInstallDate).DEVPKEY_Device_FirstInstallDate|Get-Date -Format d}
    }
    $result |ft Name, InstallDate

    При этом второй вариант не показывает на машине с Windows 10 часть локальных принтеров. Но в целом задача решена, еще раз спасибо!

    • Помечено в качестве ответа Arkhipov Alexandr 5 апреля 2017 г. 12:55
    5 апреля 2017 г. 12:55

Все ответы

  • Привет. Через WMI спробуйте.

    Или так, если покажет.

    Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |  Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
    Format-Table –AutoSize

    https://blogs.technet.microsoft.com/heyscriptingguy/2013/11/15/use-powershell-to-find-installed-software/

    • Предложено в качестве ответа Vladimir Sizasko 5 апреля 2017 г. 5:47
    • Отменено предложение в качестве ответа Arkhipov Alexandr 5 апреля 2017 г. 12:41
    5 апреля 2017 г. 5:47
  • Скачать модуль Device Management PowerShell Cmdlets .

    Типы классов устройств задается параметром -DeviceClass у командлета  Get-Device. Какие значения принимает данный параметр.

    [Enum]::GetNames([DeviceManager.Engine.DeviceClass]) -match "Print"
    GUID_DEVCLASS_DOT4PRINT
    GUID_DEVCLASS_PNPPRINTERS
    GUID_DEVCLASS_PRINTER
    GUID_DEVCLASS_PRINTERUPGRADE

    Для примера:

    PS (STA) > Get-Device -DeviceClass GUID_DEVCLASS_PRINTER | Select Name,DriverDescription,DriverVersion
    
    Name                                           DriverDescription                              DriverVersion
    ----                                           -----------------                              -------------
    Kyocera Monochrome Personal KPSL Class Driver  Kyocera Monochrome Personal KPSL Class Driver  10.0.14393.0

    И дата:

    PS (STA) > Get-Device -DeviceClass GUID_DEVCLASS_PRINTER | % {new-object psobject -prop $_.AvailableProperties} | Select *date*
    
    DEVPKEY_Device_InstallDate DEVPKEY_Device_FirstInstallDate DEVPKEY_Device_LastArrivalDate DEVPKEY_Device_DriverDate
    -------------------------- ------------------------------- ------------------------------ -------------------------
    9/21/2016 5:36:27 PM       9/21/2016 5:36:27 PM            3/31/2017 3:49:09 PM           4/21/2009 4:00:00 AM

    • Предложено в качестве ответа Dmitriy Razbornov 5 апреля 2017 г. 6:44
    • Помечено в качестве ответа Arkhipov Alexandr 5 апреля 2017 г. 12:56
    5 апреля 2017 г. 6:33
    Отвечающий
  • Спасибо за наводку, сделал с помощью модуля Device Management PowerShell Cmdlets.

    Вариант, выдающий название принтера и дату установки получился таким:

    $result = @();
    Get-Device -DeviceClass GUID_DEVCLASS_PRINTER |sort Name| ForEach-Object {
    $result += New-Object psobject -Property @{Name = $_.Name
                                               InstallDate =  (new-object psobject -prop $_.AvailableProperties|Select DEVPKEY_Device_FirstInstallDate).DEVPKEY_Device_FirstInstallDate|Get-Date -Format d}
    }
    $result |ft Name, InstallDate
    

    Однако на сервере печати 2012 R2 он выдает пустой результат. Пришлось переделать таким образом:

    $result = @();
    Get-Device |where {$_.DeviceParent -eq "SWD\PRINTENUM\PrintQueues"}|sort Name | ForEach-Object {
    $result += New-Object psobject -Property @{Name = $_.Name
                                               InstallDate =  (new-object psobject -prop $_.AvailableProperties|Select DEVPKEY_Device_FirstInstallDate).DEVPKEY_Device_FirstInstallDate|Get-Date -Format d}
    }
    $result |ft Name, InstallDate

    При этом второй вариант не показывает на машине с Windows 10 часть локальных принтеров. Но в целом задача решена, еще раз спасибо!

    • Помечено в качестве ответа Arkhipov Alexandr 5 апреля 2017 г. 12:55
    5 апреля 2017 г. 12:55