2011-08-18 69 views
1

我们有一个java进程作为本地系统用户在Windows上运行,需要访问系统中另一个用户拥有的文件。据我所知,本地系统用户应该有权模拟该用户。为此,我们传递正在访问文件的程序的tid和pid,并从中获取用户信息(令牌)。然后我们在当前线程上设置标记。像这样:java模拟

DuplicateTokenEx(hToken,MAXIMUM_ALLOWED,NULL,SecurityImpersonation,TokenImpersonation,&hTokenDup); 
SetThreadToken(NULL, hTokenDup); 

其中hToken是通过打开线程,然后通过他们的ID进行处理获得。 问题是当我试图访问一个只能被用户访问的文件而没有其他人无法读取它时。我得到一个拒绝访问错误。所以问题是我是否应该能够通过模拟访问这个文件,如果是的话,这是正确的冒充另一个用户给定一个threadid和PID。我想我也会看到Windows 7和Windows XP之间的不同行为。

+2

我对Java的知识接近于零,所以我认为如果我说废话,但...我的第一个想法是1)与其他用户一起运行2)修改文件权限 –

+0

我们不能那样做。我们事先没有这些信息。 – noahd

回答

1

对于初学者,您应该总是测试您的Windows API调用的返回值。 只有这样你才能确定令牌确实已被复制并分配给你的进程。

模仿需要一些特权,如果你是一个简单的用户,我并不确定你会有什么特权。我怀疑DuplicateTokenEx函数失败。 以管理员权限再次尝试(使用“Run as ...”工具),并让我们知道它是如何发生的。

+0

对不起,我留下了一些代码...我们正在检查返回值,一切都恢复正常。我们也是本地的系统用户,据说它有正确的特权或者至少有模拟权限。 – noahd

+0

如果您确实在SYSTEM帐户下运行,我不认为您有任何文件无法读取(或您的权限无法更改)。 – executifs