2012-03-20 57 views
0

我正在编写一个应用程序,用于在C:\ Documents and Settings \ user accounts \ Application Data文件夹中搜索特定文件。现在我正在试图使这个应用程序通用。我可以在特定用户应用程序数据文件夹中进行此应用程序搜索。但我试着做的是从某个文件或Windows XP存储它的地方获取用户名。然后让它搜索该用户。有没有特定的方法来做到这一点。哪里是Windows用户名存储在xp ...?

需要意见和建议。

+0

.Net提供了各种方法来做这种事情。你需要对你想要的更具体。你说你是通用的,但是你会让它变得复杂。你为什么不用当前登录的用户? – Nilpo 2012-03-20 05:56:14

+0

但我想以管理员身份运行它。当作为管理员我想检查每个用户的应用程序数据文件夹的某个文件。 – arya 2012-03-20 06:03:43

+0

然后迭代文档和设置下的每个文件夹以查找其应用程序数据文件夹。或者从注册表中枚举它们。 – Nilpo 2012-03-20 06:09:18

回答

0

用户名存储在Windows注册表或使用能得到FolderNames为C:\Documents and Settings包含了每一个文件夹在命令提示符下输入用户名

+0

确实注册表存储用户信息,但这只是错误的方式。文档和设置下的文件夹名称不一定与配置文件名称相匹配。 – Nilpo 2012-03-20 05:57:17

+0

实际上在Windows注册表中存储的用户名称。你能告诉我一个方向 – arya 2012-03-20 06:04:31

+0

但是'net user'命令只会显示很少的用户 – 2012-03-20 06:12:11

-2
net user 

将返回所有用户的列表...可能比你更'要求。您最好的选择是按照您计划使用“文档和设置”执行的操作。

0

这里的问题是,Microsoft没有提供直接执行此操作的API方法。也许这是一个疏忽。话虽如此,你找到的任何解决方案都将是某种解决方法,并将呈现某种限制。

使用注册表来获取此信息不是由Microsoft正式支持,因此,可能无法继续前进。

在用户配置文件夹中迭代是不可靠的,因为该文件夹并不总是以其用户命名并且因为您可以更改其位置。

依此类推。

所有这一切,我使用WMI和注册表的组合来实现这一点。这就是它在VBScript中的样子,你应该能够适应你的需求。

' Create some arrays to hold the data. 

arrUsers = Array() 
arrSIDs = Array() 
arrAppDataFolders = Array() 

' Get a list of all the non-system users with their SID 
strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2" 
Set colUsers = objWMIService.ExecQuery _ 
    ("Select * from Win32_UserAccount Where Status = 'OK'") 

i = 0 
For Each objUser in colUsers 
    ReDim Preserve arrUsers(i) 
    ReDim Preserve arrSIDs(i) 
    arrUsers(i) = objUser.Name 
    arrSIDs(i) = objUser.SID 
    i = i + 1 
Next 

Set colUsers = Nothing 
Set objWMIService = Nothing 

    ' Now go to the registry and get the Document folder location using the SID 
Const HKEY_USERS = &H80000003 

Set objRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _ 
    & strComputer & "\root\default:StdRegProv") 

ReDim arrAppDataFolders(UBound(arrSIDs)) 
For i = 0 to UBound(arrSIDs) 
    strKeyPath = arrSIDs(i) & "\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" 
    strValueName = "AppData"  ' or "Local AppData" 
    intReturn = objRegistry.GetExpandedStringValue HKEY_USERS, strKeyPath, strValueName, strValue 
    If (intReturn = 0) And (Err.Number = 0) Then 
     arrAppDataFolders(i) = strValue 
    Else 
     arrAppDataFolders(i) = vbNull 
    End If 
Next 

Set objRegistry = Nothing