批量获取AD计算机名信息

背景

由于用户加域时需要制定计算机名,为了规范起见,计算机名与AD账号有严格的对应关系。对于一些公共账号来说,就会有很多计算机名。现在需要根据该计算机名的登录时间来筛选出一些废弃计算机名,然后做删除处理,以释放计算机名。

思路

在AD管理工具(Active Directory 用户与计算机)中是可以查询计算机名的,并且在计算机的属性中可以查看创建时间和修改时间的。

ad_computer

那么用命令应该就可以批量获取了。AD获取信息的命令为dsget,通过\h获取帮助。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
>dsget \h
说明: 该工具的命令显示目录中具体对象选择的属性。dsget 命令:

dsget computer - 显示目录中计算机的属性。
dsget contact - 显示目录中联系人的属性。
dsget subnet - 显示目录中子网的属性。
dsget group - 显示目录中组的属性。
dsget ou - 显示目录中组织单位的属性。
dsget server - 显示目录中服务器的属性。
dsget site - 显示目录中站点的属性。
dsget user - 显示目录中用户的属性。
dsget quota - 显示目录中配额的属性。
dsget partition - 显示目录中分区的属性。

要显示目录中所给对象属性的任意集,请使用 dsquery * 命令 (参见以下示例)。

要获取一个具体的命令,请键入 "dsget <ObjectType> /?",这里的 <ObjectType>
是以上显示的一个受支持的对象类型。
例如,dsget ou /?。

备注:
dsget 命令有助于查看目录中特定对象的属性:
dsget 的输入是一个对象,输出则是该对象的
一系列属性。若要查找满足给定搜索标准的所有对象,
请使用 dsquery 命令(dsquery /?)。

dsget 命令支持输入管道,以允许您
通过管道输入 dsquery 命令的结果,作为 dsget 命令的输入,
然后显示 dsquery 命令所找到对象的详细信息。

可分辨名称中不用作分隔符的逗号必须用反斜杠
("\")字符转义(例如,"CN=Company\, Inc.,CN=Users,DC=microsoft,DC=com")。
用在可分辨名称中的反斜杠必须用一个反斜杠转义(例如,
"CN=Sales\\ Latin America,OU=Distribution Lists,DC=microsoft,DC=com")。

示例:
查找姓名以 "John" 开始的所有用户并显示他们的办公室
号码:

dsquery user -name John* | dsget user -office

显示对象的 sAMAccountName、userPrincipalName 和 department 属性,
该对象的 DN 是 ou=Test,dc=microsoft,dc=com:

dsquery * ou=Test,dc=microsoft,dc=com -scope base -attr
sAMAccountName userPrincipalName department

读取使用 dsquery * 命令的任何对象的所有属性。
例如,读取其 DN 为 ou=Test,dc=microsoft,dc=com
的对象的所有属性:

dsquery * ou=Test,dc=microsoft,dc=com -scope base -attr *

目录服务命令行工具可帮助:
dsadd /? - 帮助添加对象。
dsget /? - 帮助显示对象。
dsmod /? - 帮助修改对象。
dsmove /? - 帮助移动对象。
dsquery /? - 帮助查找匹配搜索标准的对象。
dsrm /? - 帮助删除对象。
dsget 成功

这里我们需要获取计算机名的信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
>dsget computer /?
描述: 显示目录中计算机的属性。此命令有两种用法。第一种用法允许您
查看多个计算机的属性。第二种用法允许您查看一个计算机成员身
份的信息。

语法: dsget computer <ComputerDN ...> [-dn] [-samid] [-sid] [-desc]
[-loc] [-disabled] [{-s <Server> | -d <Domain>}] [-u <UserName>]
[-p {<Password> | *}] [-c] [-q] [-l] [{-uc | -uco | -uci}]
[-part <PartitionDN> [-qlimit] [-qused]]

dsget computer <ComputerDN> [-memberof [-expand]]
[{-s <Server> | -d <Domain>}] [-u <UserName>]
[-p {<Password> | *}] [-c] [-q] [-l] [{-uc | -uco | -uci}]

参数:

值 描述
<ComputerDN ...> 必需项/stdin。要查看的一台或多台计算机
的可分辨名称(DN)。
如果省略了目标对象,则会从标准
输入(stdin)中读取这些对象,以支持
通过管道将其他命令的输出
用作此命令的输入。
请与以下的 <ComputerDN> 相比。
-dn 显示计算机 DN。
-samid 显示计算机的 SAM 帐户名。
-sid 显示计算机的安全 ID(SID)。
-desc 显示计算机的描述。
-loc 显示计算机的位置。
-disabled 显示计算机帐户是(yes)否(no)
被禁用。
<ComputerDN> 必需项。要查看计算机的
可分辨名称(DN)。
-memberof 显示计算机所属的组。
-expand 显示计算机所属组的循环
扩展列表。此选项采用
计算机直属组成员列表
并递归扩展该列表中
的每个组,以决定其组成员
身份和获得组的完整集。
{-s <Server> | -d <Domain>}
-s <Server> 用 <Server> 名称连接到
AD DC/LDS 实例。
-d <Domain> 连接到域 <Domain> 中的 AD DC。
默认: 登录域中的 AD DC。
-u <UserName> 以 <UserName> 身份连接。默认: 登录的用户。
用户名可以采用: 用户名、域\用户名
或用户主体名称(UPN)。
-p {<Password> | *} 用户 <UserName> 的密码。如果是 *,
则会提示您输入密码。
-c 连续操作模式: 指定了多个目标对象时,将
报告错误,但继续处理参数列表中的
下一个对象。若无此选项,命令将在遇到
第一个错误时退出。
-q 安静模式: 将所有输出抑制到标准输出。
-L 以列表格式显示搜索结果集中的项目。
默认: 表格格式。
{-uc | -uco | -uci} -uc 指定来字管道的输入或至管道的输出
用 Unicode 格式。
-uco 指定至管道或文件的输出
用 Unicode 格式。
-uci 指定来自管道或文件的输入
用 Unicode 格式。
-part <PartitionDN> 用 <PartitionDN> 的可分辨名称
连接到目录分区。
-qlimit 显示计算机在指定目录分区中
的有效配额。
-qused 显示计算机在指定目录分区中的
已使用配额。

备注:
如果您在命令提示符处没有提供目标对象,则会从标准
输入(stdin)中获取目标对象。可以通过键盘、重定向
文件或另一个命令的管道输出接受 Stdin 数据。
若要通过键盘或在重定向文件中标记 stdin 数据
的结束,请使用 Control+Z 表示文件结束(EOF)。

配额规定决定一个给定安全主体在一个特定目录分区
中能够拥有的最大目录对象数。


dsget 命令帮助您查看目录中某个特定对象
的属性: dsget 的输入是一个对象,输出是该
对象的属性列表。
若要查找满足所给搜索条件的所有对象,
请使用 dsquery 命令(dsquery /?)。

如果您提供的值包含空格,请在文本两边
使用引号(例如,"CN=DC2,OU=Domain Controllers,DC=microsoft,
DC=com")。

如果您输入了多个值,这些值必须用空格隔开
(例如,一个系列可分辨名称)。

示例:
查找在给定 OU 中名称以 "tst" 开头的所有计算机并显示其说明。

dsquery computer ou=Test,dc=microsoft,dc=com -name tst* |
dsget computer -desc

显示给定计算机 "MyDBServer" 所属的组的列表(以递归方式展开):

dsget computer cn=MyDBServer,cn=computers,dc=microsoft,dc=com
-memberof -expand

要显示给定计算机 "MyDBServer" 在给定分区 "cn=domain1,dc=microsoft,dc=com" 上
的有效配额和已用配额,请键入:

dsget computer cn=MyDBServer,cn=computers,dc=microsoft,dc=com
-part cn=domain1,dc=microsoft,dc=com -qlimit -qused


另请参阅:
dsget - 描述适用于所有命令的参数。
dsget computer - 显示目录中计算机的属性。
dsget contact - 显示目录中联系人的属性。
dsget subnet - 显示目录中子网的属性。
dsget group - 显示目录中组的属性。
dsget ou - 显示目录中组织单位的属性。
dsget server - 显示目录中服务器的属性。
dsget site - 显示目录中站点的属性。
dsget user - 显示目录中用户的属性。
dsget quota - 显示目录中配额的属性。
dsget partition - 显示目录中分区的属性。

目录服务命令行工具帮助:
dsadd /? - 有关添加对象的帮助。
dsget /? - 有关显示对象的帮助。
dsmod /? - 有关修改对象的帮助。
dsmove /? - 有关移动对象的帮助。
dsquery /? - 有关查找符合搜索条件的对象的帮助。
dsrm /? - 有关删除对象的帮助。
dsget 成功

可以看到,能显示的计算机信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-dn                 显示计算机 DN。
-samid 显示计算机的 SAM 帐户名。
-sid 显示计算机的安全 ID(SID)。
-desc 显示计算机的描述。
-loc 显示计算机的位置。
-disabled 显示计算机帐户是(yes)否(no)
被禁用。
<ComputerDN> 必需项。要查看计算机的
可分辨名称(DN)。
-memberof 显示计算机所属的组。
-expand 显示计算机所属组的循环
扩展列表。此选项采用
计算机直属组成员列表
并递归扩展该列表中
的每个组,以决定其组成员
身份和获得组的完整集。

那么修改日期的信息就只能通过AD工具来查看了。

再看下dsquery命令会不会有戏:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
>dsquery /?
描述: 该工具的命令集允许您根据指定的标准查询目录。
除 dsquery * 之外 (dsquery * 可以查询任何类型的对象),
以下每一个 dsquery 命令均可查找一个特定对象类型:


dsquery computer - 查找目录中的计算机。
dsquery contact - 查找目录中的联系人。
dsquery subnet - 查找目录中的子网。
dsquery group - 查找目录中的组。
dsquery ou - 查找目录中的组织单位。
dsquery site - 查找目录中的站点。
dsquery server - 查找目录中的 AD DC/LDS 实例。
dsquery user - 查找目录中的用户。
dsquery quota - 查找目录中的配额规定。
dsquery partition - 查找目录中的分区。
dsquery * - 用通用的 LDAP 查询来查找目录中的任何对象。

若要查找特定命令的帮助,请键入 "dsquery <ObjectType> /?",其中
<ObjectType> 是以上所示的受支持对象类型之一。
例如,dsquery ou /?。

备注:
dsquery 命令帮助您查找目录中与指定搜索
标准匹配的对象: dsquery 的输入是一个搜索标准,
其输出是与该搜索匹配的一系列对象。若要获取特定对象
的属性,请使用 dsget 命令(dsget /?)。

可以将 dsquery 命令的结果通过管道输出,作为一个
其他目录服务命令行工具(如 dsmod、dsget、dsrm 或 dsmove)的输入。

可分辨名称中不是用作分隔符的逗号必须用
反斜杠("\")字符转义(例如,
"CN=Company\, Inc.,CN=Users,DC=microsoft,DC=com")。

用在可分辨名称中的反斜杠必须用一个反斜杠转义
(例如,
"CN=Sales\\ Latin America,OU=Distribution Lists,DC=microsoft,DC=com")。


示例:
查找过去四个星期内处于非活动状态的计算机并将其从目录中删除:

dsquery computer -inactive 4 | dsrm

查找组织单位所有的用户 "ou=Marketing,dc=microsoft,dc=com" 并将他们添加到
Marketing Staff 组:

dsquery user ou=Marketing,dc=microsoft,dc=com | smod group
"cn=Marketing Staff,ou=Marketing,dc=microsoft,dc=com" -addmbr

查找姓名以 "John" 开始的所有用户并显示他的办公室号码:

dsquery user -name John* | dsget user -office

要显示目录中所给对象属性的任意集,请使用 dsquery * 命令。例如,要显示对象
(该对象的 DN 是 ou=Test,dc=microsoft,dc=com) 的 sAMAccountName,
userPrincipalName 和 department 属性:

dsquery * ou=Test,dc=microsoft,dc=com -scope base
-attr sAMAccountName userPrincipalName department

要读取对象(该对象的 DN 是 ou=Test,dc=microsoft,dc=com) 的所有属性:

dsquery * ou=Test,dc=microsoft,dc=com -scope base -attr *

目录服务命令行工具帮助:
dsadd /? - 添加对象的帮助。
dsget /? - 显示对象的帮助。
dsmod /? - 修改对象的帮助。
dsmove /? - 移动对象的帮助。
dsquery /? - 查找与搜索标准匹配对象的帮助。
dsrm /? - 删除对象的帮助。

虽然没有直接我们想要的,但是其中一个例子却很有启发:

1
2
3
查找过去四个星期内处于非活动状态的计算机并将其从目录中删除:

dsquery computer -inactive 4 | dsrm

没办法通过命令来回去修改时间,却可以直接根据非活动状态的时间选出计算机名。

那么我们最终想要的效果——获取长时间未活动的计算机名,就可以直接得到了,而不需要另行计算了。

结论

根据上面的思路,可以使用dsquery命令

  • -name test*来筛选包含test 所有计算机名
  • -inactive 24来筛选过去24周,也就是半年非活动的计算机名

完整命令如下:

1
dsquery computer -name TEST* -inactive 24