我有一个sql查询的问题,以提取计算机中的软件安装日期

时间:2018-04-05 02:54:12

标签: sql-server sccm qsqlquery

我有一个SQL查询,它将查询计算机上安装的所有产品,包括产品发布者,名称和版本。我一直试图获得这些节目的安装日期,但由于我是新手,我对此非常不满意。到目前为止,他们只提取产品公司,名称和版本。我需要将它们安装在计算机上的日期。

SELECT DISTINCT 
    SYS.Netbios_Name0, SYS.Rsqlesource_Domain_OR_Workgr0,
    SP.CompanyName, SP.ProductName, SP.ProductVersion
FROM 
    fn_rbac_GS_SoftwareProduct(@UserSIDs) SP 
JOIN 
    fn_rbac_R_System(@UserSIDs) SYS ON SP.ResourceID = SYS.ResourceID 
WHERE
    SYS.Netbios_Name0 LIKE @variable  
ORDER BY 
    SP.CompanyName, SP.ProductName, SP.ProductVersion

1 个答案:

答案 0 :(得分:0)

我不知道fn_rbac_GS_SoftwareProduct(或v_GS_SoftwareProduct)中存储的内容的确切基础是什么,但不幸的是它不包括安装日期。

有两种观点

  

v_GS_ADD_REMOVE_PROGRAMS

  

v_GS_ADD_REMOVE_PROGRAMS64

将填充来自

的数据
  

HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \微软\的Windows \ CurrentVersion \卸载

  

HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \卸载

分别。它们可能对你有用,虽然它们有几点需要注意。

  • 首先,它们来自注册表的本地计算机部分 它们不包括仅为一个用户安装的软件 (在MSI中,这是“为所有人安装”选项与“仅安装”选项 对我来说“)。

  • 其次,如果您需要完整信息,则必须使用两者,因为一个只包含32位程序,一个只包含64位程序。

  • 最后,尽管它们确实包含了InstallDate字段,但它确实基于其中一个键中的REG_SZ InstallDate,这既不是必填字段,也不是标准字段。这意味着A程序基本上只允许创建它的卸载密钥而不使用此属性。如果它被创建,也不能保证格式总是一样(例如在我们公司,我发现了两种格式YYYYMMDD和MM-DD-YYY),所以如果你想进一步处理这个列,你可能需要清理它。

虽然这听起来有点无望,但对于给定的场景来说,完全没有问题。例如,如果您通过sccm将所有应用程序安装为msi,则可以假设InstallDate密钥始终存在并且格式相同。

对此的完整查询类似于

SELECT 
    SYS.Name0, ARP.DisplayName0, ARP.Publisher0, ARP.InstallDate0 
FROM 
    v_GS_ADD_REMOVE_PROGRAMS ARP 
LEFT JOIN 
    v_R_System SYS ON SYS.ResourceID = ARP.ResourceID 
WHERE 
    SYS.Name0 = @variable 
AND NOT 
    (ARP.DisplayName0 like '%Update%' OR ARP.DisplayName0 like '%Service Pack%')
UNION 
SELECT 
    SYS.Name0, ARP.DisplayName0, ARP.Publisher0, ARP.InstallDate0 
FROM 
    v_GS_ADD_REMOVE_PROGRAMS_64 ARP 
LEFT JOIN 
    v_R_System SYS ON SYS.ResourceID = ARP.ResourceID 
WHERE 
    SYS.Name0 = @variable 
AND NOT 
    (ARP.DisplayName0 like '%Update%' OR ARP.DisplayName0 like '%Service Pack%')

请注意,我还包含一些针对Windows更新的过滤器,这些过滤器也将包含在内。我也没有直接使用rbac函数而是使用视图,我希望没问题。