我有一个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
答案 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位程序。
虽然这听起来有点无望,但对于给定的场景来说,完全没有问题。例如,如果您通过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函数而是使用视图,我希望没问题。