阅读:3317回复:26
怎样在驱动一层中获取该进程的用户名?
我用filedisk,想在IRP_MJ_READ和IRP_MJ_WRITE的时候根据用户名作不同的动作,怎么获取相应的用户名呢?就好像是user mode时候的GetUsername函数那样的功能。
|
|
最新喜欢:![]() |
沙发#
发布于:2004-04-13 16:26
可以在Mount盘的时候先用DeviceIoControl获得当前登录的用户名然后保存起来使用
|
|
板凳#
发布于:2004-04-13 18:04
我是想在读写的时候根据不同的人做不同的事,存在甲用户Mount盘,乙用户使用的情况啊。
可以在Mount盘的时候先用DeviceIoControl获得当前登录的用户名然后保存起来使用 |
|
地板#
发布于:2004-04-14 09:33
自定义IRP_USER_CHANGED
在用户模式检测到用户的身份发生变化时,将该用户名复制到DEVICEIOCONTRLO的IN BUFFER里 发送该IRP到驱动 然后在你的驱动里从SYSTEMBUFFER中获得当前用户名 任何可变的USER MODE信息都可以通过这种方式传送到内核模式。 我处理其他信息,也是这样做的 |
|
|
地下室#
发布于:2004-04-14 09:35
因为内核模式保存的用户名总是和用户模式的用户名是同步的,
所以每次使用时只需要判断内核模式保存的用户名就可以了。 |
|
|
5楼#
发布于:2004-04-14 09:36
说的不是很清楚
|
|
|
6楼#
发布于:2004-04-14 10:28
如果这样说来,对于那种网络共享的情况呢?Mount上去的盘我共享出去,拿这个时候的用户名如何处理呢?
|
|
7楼#
发布于:2004-04-14 13:28
这不是应该在驱动里面解决的问题
包括我上面提供的解决方案,其实也不应该在驱动里面解决 否则,你的驱动所做的事情太多了 能否具体讲讲你的应用 |
|
|
8楼#
发布于:2004-04-14 13:35
我是想控制那个Mount上去的盘,只有Mount的人才能够读写,其他人就不可以用,但问题是系统可能会被很多个人在用,或者某个人在系统上植入一个木马,就可以在我的盘Mount上去的时候读到数据了。
|
|
9楼#
发布于:2004-04-14 13:37
这就简单了
设置你MOUNT的盘的安全属性 只有MOUNT的人可以完全控制该盘 其余的人不能读、写、浏览 应用层编程就可以了 |
|
|
10楼#
发布于:2004-04-15 08:59
你是指用WindowsNT的NTFS格式?还是设定那个驱动器的属性?
|
|
11楼#
发布于:2004-04-15 09:13
和驱动器属性是两个概念
是安全属性 你在MSDN里面查找ACL(访问控制列表) 就是你要做的内容 |
|
|
12楼#
发布于:2004-04-15 18:59
谢谢 walkonthesky 老兄,用ACL我已经能够控制访问了,不过我遇到一个笨笨的问题,我怎么才能够拒绝everyone然后只让current user访问呢?
|
|
13楼#
发布于:2004-04-16 09:20
你可以先看一下操作的进程是不是system进程,如果不是,则为当前console用户;如果是,可以用获取进程的LUID的方法来得到使用该进程的用户的用户名(即使是共享访问)。不过该方法在Nt4.0上似乎有问题。具体做法可以参考tokenmon的源代码。
|
|
14楼#
发布于:2004-04-16 09:28
我现在是用GetNamedSecurityInfo和SetNamedSecurityInfo来实现访问控制的,如果我先设定everyone不能够访问,那么后面的设置current user可以访问就出错,反过来就完全不能访问了,有没有一个好的方法可以解决这个问题?
|
|
15楼#
发布于:2004-04-16 09:29
楼上的兄弟提的是一种方案
还有一种方案 还是ACL的问题 deny everyone 和allow currentuser这样的规则是向上覆盖的 和防火墙的规则类似 先检查第一条规则 然后再检查第二条规则 比如: 1、拒绝 所有人访问 2、容许 walkonthesky访问 则规则2覆盖规则1; 最后的结果是只有walkonthesky可以访问 除了walkonthesky以外的所有人都不能访问 在你的例子里,只需要在MOUNT动作时 将当前用户的用户名加在walkonthesky的位置上 就实现了你的功能 |
|
|
16楼#
发布于:2004-04-16 09:37
算了,把代码贴出来,大家帮忙庖丁庖丁:
char VolumeName[] = \"\\\\\\\\.\\\\ :\"; VolumeName[4] = DriveLetter; dwRes = AddAceToObjectsSecurityDescriptor ( VolumeName, // name of object SE_FILE_OBJECT, // type of object \"EVERYONE\", // trustee for new ACE TRUSTEE_IS_NAME, // format of trustee structure GENERIC_ALL, // access mask for new ACE DENY_ACCESS, // type of ACE NO_INHERITANCE // inheritance flags for new ACE ); dwRes = AddAceToObjectsSecurityDescriptor ( VolumeName, // name of object SE_FILE_OBJECT, // type of object \"CURRENT_USER\", // trustee for new ACE TRUSTEE_IS_NAME, // format of trustee structure GENERIC_ALL, // access mask for new ACE GRANT_ACCESS, // type of ACE NO_INHERITANCE // inheritance flags for new ACE ); AddAceToObjectsSecurityDescriptor 用的是MSDN上面的例子: DWORD AddAceToObjectsSecurityDescriptor ( LPTSTR pszObjName, // name of object SE_OBJECT_TYPE ObjectType, // type of object LPTSTR pszTrustee, // trustee for new ACE TRUSTEE_FORM TrusteeForm, // format of trustee structure DWORD dwAccessRights, // access mask for new ACE ACCESS_MODE AccessMode, // type of ACE DWORD dwInheritance // inheritance flags for new ACE ) { DWORD dwRes = 0; PACL pOldDACL = NULL, pNewDACL = NULL; PSECURITY_DESCRIPTOR pSD = NULL; EXPLICIT_ACCESS ea; if (NULL == pszObjName) return ERROR_INVALID_PARAMETER; // Get a pointer to the existing DACL. dwRes = GetNamedSecurityInfo(pszObjName, ObjectType, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDACL, NULL, &pSD); if (ERROR_SUCCESS != dwRes) { printf( \"GetNamedSecurityInfo Error %u\\n\", dwRes ); goto Cleanup; } // Initialize an EXPLICIT_ACCESS structure for the new ACE. ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS)); ea.grfAccessPermissions = dwAccessRights; ea.grfAccessMode = AccessMode; ea.grfInheritance= dwInheritance; ea.Trustee.TrusteeForm = TrusteeForm; ea.Trustee.ptstrName = pszTrustee; // Create a new ACL that merges the new ACE // into the existing DACL. dwRes = SetEntriesInAcl(1, &ea, pOldDACL, &pNewDACL); if (ERROR_SUCCESS != dwRes) { printf( \"SetEntriesInAcl Error %u\\n\", dwRes ); goto Cleanup; } // Attach the new ACL as the object\'s DACL. dwRes = SetNamedSecurityInfo(pszObjName, ObjectType, DACL_SECURITY_INFORMATION, NULL, NULL, pNewDACL, NULL); if (ERROR_SUCCESS != dwRes) { printf( \"SetNamedSecurityInfo Error %u\\n\", dwRes ); goto Cleanup; } Cleanup: if(pSD != NULL) LocalFree((HLOCAL) pSD); if(pNewDACL != NULL) LocalFree((HLOCAL) pNewDACL); return dwRes; } |
|
17楼#
发布于:2004-04-16 09:45
dwRes = AddAceToObjectsSecurityDescriptor (
VolumeName, // name of object SE_FILE_OBJECT, // type of object \"EVERYONE\", // trustee for new ACE TRUSTEE_IS_NAME, // format of trustee structure GENERIC_ALL, // access mask for new ACE DENY_ACCESS, // type of ACE NO_INHERITANCE // inheritance flags for new ACE ); 这段删除 是多余的 |
|
|
18楼#
发布于:2004-04-16 10:05
为什么是多余的呢?如果不设定决绝everyone,其他人不也一样可以访问吗?难道系统默认的设置是隐含拒绝所有人?好像防火墙一样?
|
|
19楼#
发布于:2004-04-16 10:33
If a Win32 object does not have a DACL, the system allows everyone full access to it.
If an object has a DACL, the system allows only the access that is explicitly allowed by the ACEs in the DACL. If there are no ACEs in the DACL, the system does not allow access to anyone. Similarly, if a DACL has ACEs that allow access to a limited set of users or groups, the system implicitly denies access to all trustees not included in the ACEs. |
|
|
上一页
下一页