Powershell 上次在工作组计算机列表上使用用户配置文件

Powershell 上次在工作组计算机列表上使用用户配置文件,powershell,batch-file,search,directory,Powershell,Batch File,Search,Directory,我需要通过Users Profile文件夹\computer\C$\Users搜索工作组计算机的列表。我并不总是知道帐户的完整登录名或命名约定,因此需要调用通配符的使用,例如Simon Heffner可能有一个Heffensi、Simonhe或Heffnsi之类的登录文件夹(根据命名约定) 使用用户文件夹中某个文件的上次修改日期,我想列出他在运行脚本时可能登录的计算机,或者至少在过去两周内登录的计算机,以防它们使用/共享多台计算机 研究表明,该文件是登录活动的良好标识符 "\\%%A\C$\Us

我需要通过Users Profile文件夹\computer\C$\Users搜索工作组计算机的列表。我并不总是知道帐户的完整登录名或命名约定,因此需要调用通配符的使用,例如Simon Heffner可能有一个Heffensi、Simonhe或Heffnsi之类的登录文件夹(根据命名约定)

使用用户文件夹中某个文件的上次修改日期,我想列出他在运行脚本时可能登录的计算机,或者至少在过去两周内登录的计算机,以防它们使用/共享多台计算机

研究表明,该文件是登录活动的良好标识符

"\\%%A\C$\Users\*%search%*\AppData\Local\Microsoft\Windows\UsrClass.dat"
我有一些代码可以工作,但只是到目前为止,需要改进

:start
CLS
echo.
echo ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set /p search=Input search string:-

for /f "usebackq tokens=*" %%A in ("%~dp0hostsfs.txt") do (

if exist "\\%%A\C$\Users\*%search%*" echo "%search% string was found in users folder on %%A" && powershell -Command "& Get-ChildItem "\\%%A\C$\Users\*%search%*\AppData\Local\temp"

)
pause & goto start
这可以按预期工作,但不使用我前面提到的文件(usrclass.dat),如果用户登录到多台PC(通常是) powershell命令的输出过于冗长,没有顺序,因此很难找到最近使用的概要文件。如果我将(usrclass.dat)文件添加到脚本中,powershell命令不会执行任何操作,它似乎会被跳过

我需要的帮助是:-

  • 列表项
使power shell与(usrclass.dat)文件一起工作,以获得更准确的上次登录报告

  • 使输出更容易在眼睛上搜索多次登录到电脑
--输出示例--

--期望输出示例--

因此,从这里我可以很容易地看到,测试PC2很可能是他在网络上使用的PC,然后我可以对该PC执行任务(以静默方式加载软件等),而不是他显然不使用的任务

   echo ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set /p search=Input search string:-

for /f "usebackq tokens=*" %%A in ("%~dp0hostsfs.txt") do (
For /d %%i in ("\\%%A\C$\Users\*%search%*") DO Psexec \\%%A -i net user %%i | find "Last logon"

) 
edit@16/11/2016成功地将其suss出来,以防其他人需要,我必须对%%I变量应用一个乘数,以仅扩展通配符的文件夹名,该通配符将始终是用户登录的文件夹名,然后在net use命令中与psexec一起使用。代码如下。 进一步编辑这使读取和分隔多个条目变得更容易

:start
cls
echo.
echo :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set /p search=Input search string:-
for /f "usebackq tokens=*" %%A in ("%~dp0hosts.txt") do (
echo.
For /d %%i in ("\\%%A\C$\Users\*%search%*") DO (
echo %%~nxi found on %%A & (
echo. 
%~dp0Psexec.exe \\%%A net user %%~nxi | find "Last logon")
    )
)
echo :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
pause & goto start 

最终答案,格式正确

:start
cls
echo.
echo :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set /p search=Input search string:-
for /f "usebackq tokens=*" %%A in ("%~dp0pxhosts.txt") do (
echo.
For /d %%i in ("\\%%A\C$\Users\*%search%*") DO (
echo %%~nxi found on %%A & (
echo. 
%~dp0Psexec.exe \\%%A net user %%~nxi | find "Last logon")
    )
)
echo :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
pause & goto start

最终答案,格式正确

:start
cls
echo.
echo :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set /p search=Input search string:-
for /f "usebackq tokens=*" %%A in ("%~dp0pxhosts.txt") do (
echo.
For /d %%i in ("\\%%A\C$\Users\*%search%*") DO (
echo %%~nxi found on %%A & (
echo. 
%~dp0Psexec.exe \\%%A net user %%~nxi | find "Last logon")
    )
)
echo :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
pause & goto start

我提出的另一种方法是查询用户配置文件usrclass.dat文件的修改日期(每次登录都会更新),它可以生成非常简洁易读的输出

使用PSEXEC的前一个答案可能过于冗长,并且始终报告错误,即使它通过通配符搜索找到用户。很难在多台电脑上找到多个条目进行筛选

用主机名列表填充pxhosts并运行。只要找到上次修改的PC用户名数据(登录),就可以得到一个很好的列表

示例输出:-

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Input search string:-adm

[PC]'DESKTOP-6285F8K' [User]'Admin' [Last Login]'09/11/2016 22:08'
[PC]'DESKTOP-6285F8K' [User]'Administrator' [Last Login]'25/10/2016 20:33'
[PC]'SRV-2008' [User]'admin' [Last Login]'21/11/2016 20:36'
[PC]'SRV-2008' [User]'Administrator' [Last Login]'21/11/2016 13:32'
[PC]'TEST-PC2' [User]'Admin' [Last Login]'21/11/2016 20:21'
[PC]'TEST-PC2' [User]'Administrator' [Last Login]'21/11/2016 20:48'

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Press any key to continue . . .

我提出的另一种方法是查询用户配置文件usrclass.dat文件的修改日期(每次登录都会更新),它可以生成非常简洁易读的输出

使用PSEXEC的前一个答案可能过于冗长,并且始终报告错误,即使它通过通配符搜索找到用户。很难在多台电脑上找到多个条目进行筛选

用主机名列表填充pxhosts并运行。只要找到上次修改的PC用户名数据(登录),就可以得到一个很好的列表

示例输出:-

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Input search string:-adm

[PC]'DESKTOP-6285F8K' [User]'Admin' [Last Login]'09/11/2016 22:08'
[PC]'DESKTOP-6285F8K' [User]'Administrator' [Last Login]'25/10/2016 20:33'
[PC]'SRV-2008' [User]'admin' [Last Login]'21/11/2016 20:36'
[PC]'SRV-2008' [User]'Administrator' [Last Login]'21/11/2016 13:32'
[PC]'TEST-PC2' [User]'Admin' [Last Login]'21/11/2016 20:21'
[PC]'TEST-PC2' [User]'Administrator' [Last Login]'21/11/2016 20:48'

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Press any key to continue . . .

在用户文件夹中找到与搜索模式匹配的文件夹后,只需使用与该用户名匹配的net user命令即可获取上次登录日期
net user squashman |查找“上次登录”
不要使用IF-EXIST来查找与您的搜索模式匹配的文件夹。只需使用
FOR/D
命令,文件夹名称就可以在变量中与
NET USER
命令一起使用。您需要使用psexec在正在检查的远程计算机上运行NET USER命令。您在第二个FOR命令中缺少DO。您永远不应该只获得%i作为输出。如果IN子句未找到匹配项,则do子句将永远不会执行。不管怎样,您都不希望在PSEXEC中使用-i选项。阅读帮助,您将了解原因。在用户文件夹中找到与搜索模式匹配的文件夹后,只需使用与该用户名匹配的net user命令即可获取上次登录日期
net user squashman |查找“上次登录”
不要使用IF-EXIST来查找与您的搜索模式匹配的文件夹。只需使用
FOR/D
命令,文件夹名称就可以在变量中与
NET USER
命令一起使用。您需要使用psexec在正在检查的远程计算机上运行NET USER命令。您在第二个FOR命令中缺少DO。您永远不应该只获得%i作为输出。如果IN子句未找到匹配项,则do子句将永远不会执行。不管怎样,您都不希望在PSEXEC中使用-i选项。阅读帮助,你就会明白为什么。
:start
cls
echo.
echo ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set /p search=Input search string:-
echo.
for /f "usebackq tokens=*" %%A in ("%~dp0pxhosts.txt") do (
for /d %%i in ("\\%%A\C$\Users\*%search%*") DO (
for %%g in ("%%i\AppData\Local\Microsoft\Windows\usrclass.dat") DO Echo [PC]'%%A' [User]'%%~nxi' [Last Login]'%%~tg'
    )
)
echo.
echo ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
pause & goto start
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Input search string:-adm

[PC]'DESKTOP-6285F8K' [User]'Admin' [Last Login]'09/11/2016 22:08'
[PC]'DESKTOP-6285F8K' [User]'Administrator' [Last Login]'25/10/2016 20:33'
[PC]'SRV-2008' [User]'admin' [Last Login]'21/11/2016 20:36'
[PC]'SRV-2008' [User]'Administrator' [Last Login]'21/11/2016 13:32'
[PC]'TEST-PC2' [User]'Admin' [Last Login]'21/11/2016 20:21'
[PC]'TEST-PC2' [User]'Administrator' [Last Login]'21/11/2016 20:48'

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Press any key to continue . . .