以下是GetSecurityDescriptorDacl函数原型:
BOOL GetSecurityDescriptorDacl(
PSECURITY_DESCRIPTOR pSecurityDescriptor,
PBOOL pfDACLPresent,
PACL *pDACL,
PBOOL pfDACLDefaulted);
这个函数撷取一个指向安全描述项的DACL指标,也指出DACL是否为当前的,以及它起初是否已透过预设安全性建立。您所提供之安全描述项与Boolean值的位址会指出DACL是否为当前的,而PACL变数的位址则用来撷取DACL;另一个Boolean值位址,系统用它来指出DACL是否被设为预设值。
为了将DACL放回安全描述项,您可以使用SetSecurityDescriptorDacl函数:
BOOL SetSecurityDescriptorDacl(
PSECURITY_DESCRIPTOR pSecurityDescriptor,
BOOL bDaclPresent,
PACL pDacl,
BOOL bDaclDefaulted);
这个函数仅取得指向您想修改之安全描述项对象的指标,而Boolean值则指出DACL是否为当前的,以及它是否为预设安全性的结果(您通常会传递FALSE值)。SetSecurityDescriptorDacl函数要求一个指向DACL的指标,这个DACL会成为安全描述项的新DACL。
说明
您不该试图设定DACL或任何其他系统之任何对象传回的安全描述项元件。您应该总是建立一个新的安全描述项,并对它设定DACL及SACL元件。这是由于系统传回的安全描述项被封装至selfrelative格式的缘故。这意味着进入单一连续内存区块的资料,并没有留下可修改的空间。
当您使用InitializeSecurityDescriptor函数分配内存及初始化一个新的安全描述项时,系统会初始一个absolute格式的安全描述项。一个absolute格式的安全描述项使用了指标,以参考其他的元件,它可让元件被设定及重新设定。
RoboService范例服务程序
RoboService范例服务程序(「10 RoboService.exe」)示范如何利用私有安全对象及主从架构存取控制使用命名管道的方法。此应用程序的原始码及文件存放于随书光碟上的10-RoboService目录中。
当您使用「/install」参数启动RoboService时,应用程序会把它自己当成服务,并安装在系统上(如图10-8),然后您就可以使用任何服务控制程序启动及停止服务。同样地,如果您正在执行除错工具的服务程序,则您可以传递「/debug」参数,使服务在除错模式下执行,并绕过服务功能。
| 图10-8 RoboService的命令列选项 |
在执行服务后,您可以执行RoboClient范例应用程序,它的执行画面显示于图10-9,然后再输入执行服务的系统电脑名称。假如您不输入电脑名称的话,客户端会试图连接本机上的服务。
一旦连接成功,您将会看到服务所建立的「虚拟机器」清单。您可以增加及移除机器。使用服务端的私有安全功能保护这些机器。您可以让机器执行几个已定义的行为,包括编辑机器的安全性等等。
| 图10-9 RoboClient范例应用程序的使用者介面 |
