windows 中降权限,ACL。高手进。

大石头1987 2011-02-25 04:46:42
现在又一个程序是以system权限启动的,我要在这个程序中创建一个线程,我想让这个线程运行在较低级别的权限中,我是用以下方法做的:
	DWORD dwRes, dwDisposition;
PSID pEveryoneSID = NULL, pAdminSID = NULL;
PACL pACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea[2];
SID_IDENTIFIER_AUTHORITY SIDAuthWorld =SECURITY_WORLD_SID_AUTHORITY;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
SECURITY_ATTRIBUTES sa;
LONG lRes;
// Create a well-known SID for the Everyone group.
if(!AllocateAndInitializeSid(&SIDAuthWorld, 1,
SECURITY_WORLD_RID,
0, 0, 0, 0, 0, 0, 0,
&pEveryoneSID))
{
OutputDebugString(_T("AllocateAndInitializeSid Error "));
goto Cleanup;
}

// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow Everyone read access to the key.
ZeroMemory(&ea, 2 * sizeof(EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = KEY_READ;
ea[0].grfAccessMode = SET_ACCESS;
ea[0].grfInheritance= NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; ea[0].Trustee.ptstrName = (LPTSTR) pEveryoneSID;

// Create a SID for the BUILTIN\Administrators group.
if(! AllocateAndInitializeSid(&SIDAuthNT, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&pAdminSID))
{
OutputDebugString(_T("AllocateAndInitializeSid Error "));
goto Cleanup;
}

// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow the Administrators group full access to
// the key.
ea[1].grfAccessPermissions = KEY_ALL_ACCESS;
ea[1].grfAccessMode = SET_ACCESS;
ea[1].grfInheritance= NO_INHERITANCE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[1].Trustee.TrusteeType = TRUSTEE_IS_GROUP; ea[1].Trustee.ptstrName = (LPTSTR) pAdminSID;

// Create a new ACL that contains the new ACEs.
dwRes = SetEntriesInAcl(2, ea, NULL, &pACL);
if (ERROR_SUCCESS != dwRes)
{
OutputDebugString(_T("SetEntriesInAcl Error "));
goto Cleanup;
}

// Initialize a security descriptor.
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,
SECURITY_DESCRIPTOR_MIN_LENGTH);
if (NULL == pSD)
{
OutputDebugString(_T("LocalAlloc Error"));
goto Cleanup;
}

if (!InitializeSecurityDescriptor(pSD,
SECURITY_DESCRIPTOR_REVISION))
{
OutputDebugString(_T("InitializeSecurityDescriptor Error "));
goto Cleanup;
}

// Add the ACL to the security descriptor.
if (!SetSecurityDescriptorDacl(pSD,
TRUE, // bDaclPresent flag
pACL,
FALSE)) // not a default DACL
{
OutputDebugString(_T("SetSecurityDescriptorDacl Error %u\n"));
goto Cleanup;
}

// Initialize a security attributes structure.
sa.nLength = sizeof (SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = FALSE;
hThreadETDApi = CreateThread(&sa, NULL, LoadETDApiThreadFun,
this, NULL, NULL);

但是在我将这个设置过的sa传到CreateThread中时,却得不到想要的结果。。。红色字体是我设置一般用户和admin权限。为何在线程里面我得不到这两个值,即设置失败。。。。
跪求高手解答。。。。。。。。。。。。。。
...全文
267 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
大石头1987 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 oyljerry 的回复:]
引用 7 楼 wang19870102 的回复:

引用 3 楼 oyljerry 的回复:
最好还是通过设置进程权限来完成你线程的功能,CreateProcessAsUser()

我是想用进程啊,可是进程会是我整个程序的权限都降了。

你创建一个单独的进程啊,这样父进程权限不会有影响,所有需要降权限的工作都在这个新进程中处理
[/Quote]
单独创一个进程可以,但是应该在主调进程中去降将要起来进程的权限吧,如果放到新进程中,应该是不能降得。
oyljerry 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wang19870102 的回复:]

引用 9 楼 oyljerry 的回复:
引用 7 楼 wang19870102 的回复:

引用 3 楼 oyljerry 的回复:
最好还是通过设置进程权限来完成你线程的功能,CreateProcessAsUser()

我是想用进程啊,可是进程会是我整个程序的权限都降了。

你创建一个单独的进程啊,这样父进程权限不会有影响,所有需要降权限的工作都在这个新进程中处理

能……
[/Quote]
Admin的话,你需要有用户名,password等
http://msdn.microsoft.com/en-us/library/ms682431(v=vs.85).aspx
大石头1987 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 oyljerry 的回复:]
引用 7 楼 wang19870102 的回复:

引用 3 楼 oyljerry 的回复:
最好还是通过设置进程权限来完成你线程的功能,CreateProcessAsUser()

我是想用进程啊,可是进程会是我整个程序的权限都降了。

你创建一个单独的进程啊,这样父进程权限不会有影响,所有需要降权限的工作都在这个新进程中处理
[/Quote]
能提供确实可行的降权限代码么,我试了好多,都不行,我是将system权限降低到admin权限。能否提供,网上的那些代码都不能降下来。。。。
oyljerry 2011-02-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wang19870102 的回复:]

引用 3 楼 oyljerry 的回复:
最好还是通过设置进程权限来完成你线程的功能,CreateProcessAsUser()

我是想用进程啊,可是进程会是我整个程序的权限都降了。
[/Quote]
你创建一个单独的进程啊,这样父进程权限不会有影响,所有需要降权限的工作都在这个新进程中处理
MoXiaoRab 2011-02-26
  • 打赏
  • 举报
回复
SetThreadToken
大石头1987 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oyljerry 的回复:]
最好还是通过设置进程权限来完成你线程的功能,CreateProcessAsUser()
[/Quote]
我是想用进程啊,可是进程会是我整个程序的权限都降了。
大石头1987 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hhwei1985 的回复:]
引用 3 楼 oyljerry 的回复:
最好还是通过设置进程权限来完成你线程的功能,CreateProcessAsUser()
.
[/Quote]
我是要在这个线程里面调用一个dll,而这个dll却只能以一般用户权限或者admin来load。SO......
大石头1987 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zzz3265 的回复:]
CreateThread 指定权限是指 这个线程的HANDLE的权限, 而不是线程自身执行的权限

指定执行权限使用 SetThreadToken, (DuplicateToken, LogonUser)...
[/Quote]
那我是在线程里面去设置,还是在createthread之后去设置呢?????
hhwei1985 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oyljerry 的回复:]
最好还是通过设置进程权限来完成你线程的功能,CreateProcessAsUser()
[/Quote].
oyljerry 2011-02-25
  • 打赏
  • 举报
回复
最好还是通过设置进程权限来完成你线程的功能,CreateProcessAsUser()
Lactoferrin 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zzz3265 的回复:]

CreateThread 指定权限是指 这个线程的HANDLE的权限, 而不是线程自身执行的权限

指定执行权限使用 SetThreadToken, (DuplicateToken, LogonUser)...
[/Quote]
正确,使用CreateRestrictedToken得到受限令牌,然后使用SetThreadToken
Yofoo 2011-02-25
  • 打赏
  • 举报
回复
CreateThread 指定权限是指 这个线程的HANDLE的权限, 而不是线程自身执行的权限

指定执行权限使用 SetThreadToken, (DuplicateToken, LogonUser)...
一、启用guest来宾帐户; 二、控制面板→管理工具→本地安全策略→本地策略→用户权利指派里,“从网络访问此计算机”中加入guest帐户,而“拒绝从网络访问这台计算机”中删除guest帐户; 三、我的电脑→工具→文件夹选项→查看→去掉“使用简单文件共享(推荐)”前的勾; 四、设置共享文件夹; 五、控制面板→管理工具→本地安全策略→本地策略→安全选项里,把“网络访问:本地帐户的共享和安全模式”设为“仅来宾-本地用户以来宾的身份验证”(可选,此项设置可去除访问时要求输入密码的对话框,也可视情况设为“经典-本地用户以自己的身份验证”); 六、右击“我的电脑”→“属性”→“计算机名”,该选项卡中有没有出现你的局域网工作组名称,如“work”等。然后单击“网络 ID”按钮,开始“网络标识向导”:单击“下一步”,选择“本机是商业网络的一部分,用它连接到其他工作着的计算机”;单击“下一步”,选择“公司使用没有域的网络”;单击“下一步”按钮,然后输入你的局域网的工作组名,如“work”,再次单击“下一步”按钮,最后单击“完成”按钮完成设置。 访问网上邻居时显示:" windows xp系统访问局域网时显示 "WORKGROUP无法访问.您可能没有权限使用网络资源.请与这台服务器的管理员联系以查明您是否有访问权限.此工作组的服务器的列表当前无法使用." 我用的是xp系统 我也遇到过这样的情况,当时也是着急得不轻,后来看到了以下的内容,照着一步步的做了做,真的好了。内容不少,但是仍然希望你能耐住性子,仔细的看看自己属于那种情况,应该会有所收获。 局域网互访 - [ 网络 ] 我也是类似问题。 以前一个局域网10多台机子互访问。安了蕃茄花园v2.3,感觉主题漂亮,桌面壁纸自动换,很爽。访问局域网计算机没问题。可网内其它机子在工作组内能看到我的机子,但打不开。说什么“没有权限”。所有设置都作了如下改动(网上找的),依然无效,何故?但求高手指点。 “网上邻居”无法互访问题解决方法大全 “网上邻居”无法互访的问题实在是太常见了,无论在学校,网吧还是家里多台电脑联机,都有可能遇到网上邻居无法互访的故展。“网上邻居”无法访问的故障多种多样,总结起来基本上有下面的几个: 1,没有共享资源/共享服务未启用。 症状:电脑与电脑间可以Ping通,但无法访问共享资源,在“计算机管理”中查看“本地共享”后会弹出“没有启动服务器服务”的错误对话框。 解决:在控制面板-管理工具-服务中启动Server服务。并设置“启动类型”为“自动”。 2,IP设置有误。 症状:双机之间无法互Ping,连接用的双绞线经过测试没有问题,没有安装防火墙。 解决:检查两台电脑的IP是否处在同一网段,还有子掩码是否相同。 3,WINXP默认设置不正确。 症状:从WIN98/2000/2003上无法访问另一台WINXP的机器。 解决:在“控制面板”中的“用户帐户”启用Guest帐号。然后在运行中输入secpol.msc启动“本地安全策略”。 本地策略 -> 用户权利指派,打开“从网络访问此计算机”,添加Guest帐户 本地策略 -> 安全选项,禁止"帐户:使用空白密码的本地帐户只允许行控制台登陆"。 另外有时还会遇到另外一种情况:访问XP的时候,登录对话框中的用户名是灰的,始终是Guest用户,不能输入别的用户帐号。 解决:本地策略 -> 安全选项 -> "网络访问:本地帐户的共享和安全模式",修改为"经典-本地用户以自己的身份验证" 4,系统漏洞修补软件修改了安全策略。 症状:在“网上邻居”中可以看到对方的计算机,但是访问共享时却提示“没有权限访问网络” 解决:在开始菜单运行中输入secpol.msc启动“本地安全策略”,本地策略 -> 用户权利分配,打开“拒绝从网络访问这台计算机”,删除guest用户。 5,防火墙规则。 症状:安装了防火墙(包括WINXP系统自带的防火墙),出现无法Ping通,或者是访问共享资源的时候提示"XXX无法访问"、"您可能没有权限使用网络资源"、"请与这台服务器的管理员联系以查明您是否有访问权限"、"找不到网络路径"等类似的提示。 解决:停止防火墙或者添加局域网的访问规则。 WINXP自带的防火墙:打开控制面板 -> 网络和Internet连接 -> Windows防火墙 -> 例外,勾选“文件和打印机共享”。 6,Win2000/XP与Win98互访 症状:Ping命令可以通过,但无法在“网上邻居”中实现互访。 解决:在WIN2000/XP系统中:控制面板 -> 管理工具 -> 计算机管理 -> 本地用户和组 -> 用户,在Guest帐户上点击鼠标右键,选择属性,在常规项里取消
方法一,BIOS设置法(快刀斩乱麻法)  

  入BIOS设置,选择“Integrated Peripherals”选项,展开后将“USB 1.1 Controller”和“USB 2.0 Contr01ler”选项的属性设置为“Disableed”,即可禁用USB接口。最后别忘记给BIOS设置上一个密码,这样他人就无法通过修改注册表解“锁”上述设备了。  

  注意:这个方法是完全禁止了USB接口,也就是说各种USB接口的设备均不能用了,当然也包括了U盘和移动盘。由于此法过于霸道,请慎用。  

  方法二,禁止闪盘或移动硬盘的启动(适用于Windows XP/2000/2003)  

  打开注册表编辑器,依次展开如下分支[HKEY_LOCAL_MACHINE\SYSTEM\CurrentCntrolSet\Services\USBSTOR],在右侧的窗格中找到名为“Start”的DWORD值,双击,在弹出的编辑对话框中将其数值数据修改为十六位制数值“4”。点“确定”按钮并关闭注册表编辑器,重新启动计算机,使设置生效。重启后,当有人将USB存储设备连接到计算机时,虽然USB设备上的指示灯在正常闪烁,但在资源管理器当中就是无法找到其盘符,因此也就无法使用USB设备了。

  方法三,隐藏盘符和禁止查看(适用于Windows系统)  

  打开注册表编辑器,依次展开如下分支[HKEY_CURRENT_USER\software\Microsoft\Windows\CurrentVersion\Ploicies\Explorer],新建二制值“NoDrives”,其缺省值均是00 00 00 00,表示不隐藏任何驱动器。键值由四个字节组成,每个字节的每一位(bit)对应从A:到Z:的一个盘,当相应位为1时,“我的电脑”中相应的驱动器就被隐藏了。第一个字节代表从A到H的8个盘,即01为A,02为B,04为C……依次类推,第二个字节代表I到P,第三个字节代表Q到X,第四个字节代表Y和Z。比如要关闭C盘,将键值改为04 00 00 00;要关闭D盘,则改为08 00 00 00,若要关闭C盘和D盘,则改为0C 00 00 00(C是十六制,转成十制就是12)。

  理解了原理后,下面以我的电脑为例说明如何操作:我的电脑有一个软驱、一个硬盘(5个分区)、一个光驱,盘符分布是这样的:A:(3.5软盘)、C:、D:、E:、F:、G:、H:(光盘),所以我的“NoDrives”值为“02 ff ff ff”,隐藏了B、I到Z盘。  

  重启计算机后,再插入U盘,在我的电脑里也是看不出来的,但在地址栏里输入I:(我的电脑电后一个盘符是H)还是可以访问移动盘的。到这里大家都看得出“NoDrives”只是障眼法,所以我们还要做多一步,就是再新建一个二制“NoViewOnDrive”,值改为“02 ff ff ff”,也就是说其值与“NoDrives”相同。 这样一来,既看不到U盘符也访问不到U盘了。  

  方法四,禁止安装USB驱动程序  

  在Windows资源管理器中,入到“系统盘:\WINDOWS\inf”目录,找到名为“Usbstor.pnf”的文件,右键点击该文件,在弹出菜单中选择“属性”,然后切换到“安全”标签页,在“组或用户名称”框中选中要禁止的用户组,接着在用户组的权限框中,选中“完全控制”后面的“拒绝”复选框,最后点击“确定”按钮。  

  再使用以上方法,找到“usbstor.inf”文件并在安全标签页中设置为拒绝该组的用户访问,其操作过程同上。完成了以上设置后,该组中的用户就无法安装USB设备驱动程序了,这样就达到禁用的目的。  

  注意:要想使用访问控制列表(ACL),要采用NTFS文件系统。  

  结束语  

  正所谓乱花渐欲迷人眼,经过以上四个步骤,就算是个中高手,想查找突破防线也要大费周折了,有时候解决问题不一定是找别人提供的解决方案,那是要钱的。对于老板来说要钱就等于要他的命,呵呵,还是自己想法子解决吧。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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