NetFileGetInfo,NetFileEnum使用疑问(获取用户名问题),up有分,不够再加,1000都没问题,只要求解。

liuguangzhou 2008-10-31 08:57:48
在制作一个服务器端的文件监控系统中,使用NetFileEnum获取所有资源的访问。
例如有一个文件被用户访问,这时我想获得是哪个用户访问的这个文件,
使用NetFileGetInfo获取这个文件的信息,能够获取访问这个文件的所有用户。
问题出在这里:当访问的用户只有一个时,能够正确地获取。
当访问的用户有多个,这时,哪个用户先访问文件所在的文件夹,哪个用户就被列了出来。
而真正对文件操作的用户,没有被获取到。

请问各位大侠,怎么样解决这个问题,是不是有什么地方设置不对?还是应该用别的API?

代码如下,省略了一些无关紧要的东西。

netapistatus = NetFileEnum((char *)RemoteName, (char *)BasePath, (char *)UserName, Level, &ptb, MAX_PREFERRED_LENGTH, &dw1, &dw2, NULL);
if (netapistatus != NERR_Success || ptb == NULL)
{
str.Format("Error %d enumerating open files: %d. ", netapistatus, ++FailNumber );
LogOut(str);
}
else
{
FILE_INFO_3 *pfileinfo3 = (FILE_INFO_3 *)ptb;

for (d = 0; d < dw1; d++)
{
if (Level > 2)
{
LPBYTE tempFileInfo;
netapistatus = NetFileGetInfo((char *)RemoteName, pfileinfo3->fi3_id, 3, &tempFileInfo);

if (netapistatus != NERR_Success || ptb == NULL)
{
str.Format("Error %d NetFileGetInfo open files: %d. ", netapistatus, ++FailNumber );
LogOut(str);
}
else
{
FILE_INFO_3 *pfileinfo = (FILE_INFO_3 *)tempFileInfo;
if (pfileinfo->fi3_username != NULL && wcslen((LPWORD)pfileinfo->fi3_username) )
{
int num=WideCharToMultiByte( CP_ACP, 0, (unsigned short *)(pfileinfo->fi3_username), -1, szUserName, 0, NULL, NULL);
WideCharToMultiByte( CP_ACP, 0, (unsigned short *)(pfileinfo->fi3_username), -1, szUserName, num, NULL, NULL);
strUsername.Format("%s", szUserName);
}
}

NetApiBufferFree(tempFileInfo);
}
}
}
...全文
217 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangyz_ecc 2008-11-22
  • 打赏
  • 举报
回复
up
superdiablo 2008-11-15
  • 打赏
  • 举报
回复
liuguangzhou 2008-11-15
  • 打赏
  • 举报
回复
多谢顶的兄弟们。
luyue720 2008-11-15
  • 打赏
  • 举报
回复
up
topcyc 2008-11-14
  • 打赏
  • 举报
回复
顶了再顶
liuguangzhou 2008-11-03
  • 打赏
  • 举报
回复
请各位不吝赐教。非常感谢!!
stuarts740 2008-11-01
  • 打赏
  • 举报
回复
顶,,学习中
sanshao27 2008-10-31
  • 打赏
  • 举报
回复
up
yeah920 2008-10-31
  • 打赏
  • 举报
回复
只能帮顶。
liuguangzhou 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 palmax 的回复:]
引用 5 楼 liuguangzhou 的回复:
引用 1 楼 palmax 的回复:
帮顶

WideCharToMultiByte那里,szUserName你分配的长度是多少? 会不会小于num? 至少应该以num为大小给szUserName分配内存


WideCharToMultiByte这里要调用两次,第一次是获取num的长度,第二次是真正的转换。


我的意思是你获取的长度和szUserName分配长度比较过没? 如果你给szUserName分配的长度小于num呢?
连话都听不懂,无语~~~
[/Quote]

长度没问题,再说也不是长度的问题。
palmax 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liuguangzhou 的回复:]
引用 1 楼 palmax 的回复:
帮顶

WideCharToMultiByte那里,szUserName你分配的长度是多少? 会不会小于num? 至少应该以num为大小给szUserName分配内存


WideCharToMultiByte这里要调用两次,第一次是获取num的长度,第二次是真正的转换。
[/Quote]

我的意思是你获取的长度和szUserName分配长度比较过没? 如果你给szUserName分配的长度小于num呢?
连话都听不懂,无语~~~
liuguangzhou 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 LBPeking 的回复:]
多个用户访问的时候确认是没有获取?
还是获取到了,而是你没有正确“保存”起来,
值丢失了????
[/Quote]

我也想是不是这个问题,我用循环把每一个获取的名字都列出来了。但是没有正确的结果。多半只列出一个。
闪破风浪 2008-10-31
  • 打赏
  • 举报
回复
多个用户访问的时候确认是没有获取?
还是获取到了,而是你没有正确“保存”起来,
值丢失了????
liuguangzhou 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 palmax 的回复:]
帮顶

WideCharToMultiByte那里,szUserName你分配的长度是多少? 会不会小于num? 至少应该以num为大小给szUserName分配内存
[/Quote]

WideCharToMultiByte这里要调用两次,第一次是获取num的长度,第二次是真正的转换。
hucailai 2008-10-31
  • 打赏
  • 举报
回复
UP First
hucailai 2008-10-31
  • 打赏
  • 举报
回复
UP First
palmax 2008-10-31
  • 打赏
  • 举报
回复
帮顶

WideCharToMultiByte那里,szUserName你分配的长度是多少? 会不会小于num? 至少应该以num为大小给szUserName分配内存
liuguangzhou 2008-10-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 Mackz 的回复:]
首先,NetFileEnum传入用户名的话(第3个参数),只枚举该用户访问的文件,所以你的该参数应该为NULL才枚举所有用户访问的文件;其次NetFileGetInfo返回的是一个FILE_INFO_2或者FILE_INFO_3结构数组,应该循环查询该数组获取每个用户名。
[/Quote]

非常感谢您的建议。
对于首先,我是采用的NULL来枚举所有用户访问的文件,在代码中没有体现出来。

其次也是我觉得最有可能出现问题的地方,NetFileGetInfo返回了一个结构数组,但是并没有像NetFileEnum那样有一个返回值标明有多少个用户在这里访问。

如果能够有多个用户的话,随之而来的问题是,如果是删除操作,肯定是一个用户,但是所有在被删除目录下的停留的用户都被列了出来。

请问我的理解是否正确,谢谢。
菜牛 2008-10-31
  • 打赏
  • 举报
回复
首先,NetFileEnum传入用户名的话(第3个参数),只枚举该用户访问的文件,所以你的该参数应该为NULL才枚举所有用户访问的文件;其次NetFileGetInfo返回的是一个FILE_INFO_2或者FILE_INFO_3结构数组,应该循环查询该数组获取每个用户名。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧