2010-06-08 51 views
3

我需要一种方法来存储当前用户的SID在一个变量,我尝试了很多的变种:店SID在一个变量

setlocal enableextensions 
for /f "tokens=*" %%a in ( 
'"wmic path win32_useraccount where name='%UserName%' get sid"' 
) do ( 
if not "%%a"=="" 
set myvar=%%a 
echo/%%myvar%%=%myvar% 
pause 
endlocal 

没有正常工作。

wmic path win32_useraccount where name='%UserName%' get sid 应该返回3行,我需要第二个存储在一个变量。

有人可以修复我的脚本吗?

编辑:我正在使用.cmd文件。

回答

4

这应该修复它:

for /f "delims= " %%a in ('"wmic path win32_useraccount where name='%UserName%' get sid"') do (
    if not "%%a"=="SID" (   
     set myvar=%%a 
     goto :loop_end 
    ) 
) 

:loop_end 
echo %%myvar%%=%myvar% 

记下的"delims= " FOR循环。它会将空格处的输入分隔开,这些空格位于WMI查询输出结尾处。

条件if not "%%a"=="SID"将在第二次迭代中为真,然后分配变量并跳出循环。

希望有所帮助。

+0

感谢的人,是DIT它,对于最近的反应感到遗憾,我正忙于做其他的事情 – user361191 2010-08-06 11:44:08

1

另一种解决办法是:

FOR /F "tokens=1,2 delims==" %%s IN ('wmic path win32_useraccount where name^='%username%' get sid /value ^| find /i "SID"') DO SET SID=%%t 
1

我写这篇文章的代码和它的工作对我好

for /F "tokens=2" %%i in ('whoami /user /fo table /nh') do set usersid=%%i 
+0

我喜欢这个,但如果用户名包含是一个空间? – Jason 2017-06-12 14:28:40

+0

另外值得注意的是,whoami的处理速度比wmic快得多。 – Jason 2017-06-12 14:38:46

0

WMIC的另一实施

@ECHO OFF 
::SET Variables 
SET _USERSID=NoValue 
SET _User=QueryUserName 
::Run the WMIC Command 
@FOR /F "SKIP=1" %A IN ('"wmic useraccount where name='%_User%' get sid"') DO @FOR %B IN (%A) DO @SET _USERSID=%B 

::Now do something with the SID IF EXISTS 
:: Example below 
cls 
::Advise if the UserID was valid and echo out WMIC results 
@IF %_USERSID% == NoValue ECHO  USER ****%_User%**** NOT VALID 
@ECHO  WMIC Command %_USERSID% 

::Example of using the WMIC %_USERSID% variable for something 
@IF NOT %_USERSID% == NoValue REG DELETE "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\%_USERSID%" /F 

::SET ECHO Command Prompt ON 
@ECHO ON