我希望能够只运行一个xcopy实例,而不是很多,从usb驱动器到我插入的计算机上的。\ admin \ desktop,不过可能有一些我上过的计算机有管理员用户名已更改为此人的姓名。对于Windows的管理员用户帐户,是否存在通用批处理namimg约定?如果是这样,我只想使用它,而不是列出每个计算机的每个人的用户名,并猜测它可能是什么,而不是每次都看。 以下是我到目前为止的情况,如果我知道“管理员”用户仍然标记为“管理员”,则效果很好。
@echo off
xcopy "%~dp0M1k_SWPCB\*.*" "C:\Documents and Settings\Admin\Desktop\SWPCB\" /d /s /h /v /c /f /k /y
pause
我也尝试过“所有用户”,但在某些情况下,该目录不存在,也无法使用。此外,如果计算机有多个用户,我不希望它在每个人的桌面上。
非常感谢任何帮助。
由于
答案 0 :(得分:2)
所有用户都有一个SID标识符,本地管理员帐户始终以-500后缀结尾,因此您可以通过检查注册表中的SID来获取管理员用户名:
@Echo OFF
FOR /F "Tokens=*" %%@ IN ('Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" ^| FIND "-500"') DO (
FOR /F "Tokens=2,*" %%A IN ('Reg Query "%%@" /v "ProfileImagePath" ^| FIND /V "%%@"') DO (
Echo Admin SID: %%~n@
Echo Admin Folder: %%B
)
)
Pause>NUL&Exit
<强>输出:强>
Admin SID: S-1-5-21-148789306-3749789949-2179752015-500
Admin Folder: C:\Users\Administrador
另一种方法是使用VBScript,您可以在批处理文件中使用它并将管理员名称写入文本文件,然后接下来您将设置一个带有文本文件内容的变量。 (我没有写这个函数):
Set objNetwork = CreateObject("Wscript.Network")
objComputerName = objNetwork.ComputerName
Set objwmi = GetObject("winmgmts:{impersonationLevel=impersonate}!//" & objComputerName)
qry = "SELECT * FROM Win32_Account where Domain = '" & cstr(objComputerName) & "'"
For Each Admin In objwmi.ExecQuery(qry)
If (Left(Admin.sid, 6) = "S-1-5-" And Right(Admin.sid,4) = "-500") Then MsgBox Admin.name)
Next
PS:也许有人会发布其他解决方案,说列出组名是另一种选择......但是组名不是通用的解决方案'因为是母语。