好的,所以这是基于:Working example of CreateJobObject/SetInformationJobObject pinvoke in .net?
我创建了一个作业对象并将其附加到MS Word实例。作业对象具有UI限制WriteClipboard。我的假设是,这应该阻止人们从文档中复制。但他们仍然可以粘贴到它。但是,只有这个限制我才能做到这两点。
我知道在AssignProcessToJobObject完成后,在Process explorer的选项卡中正确显示了Job Object已被应用。
如果我指定了LIMIT Read & 写剪贴板ui限制,我会认为这是行为。
以下是上面链接的构造函数 - 我添加了UIRestriction - Write Clipbard
public Job(string jobName)
{
handle = CreateJobObject(IntPtr.Zero, jobName);
var info = new JOBOBJECT_BASIC_LIMIT_INFORMATION
{
LimitFlags = 0x2000
};
var extendedInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION
{
BasicLimitInformation = info
};
int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION));
IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length);
Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false);
if (!SetInformationJobObject(handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, (uint)length))
throw new Exception(string.Format("Unable to set information. Error: {0}", Marshal.GetLastWin32Error()));
///UIRestrictions
var uiRestrictions = new JOBOBJECT_BASIC_UI_RESTRICTIONS
{
UIRestrictionsClass = 0x00000004 //No write to clipboard
};
length = Marshal.SizeOf(typeof(JOBOBJECT_BASIC_UI_RESTRICTIONS));
IntPtr basicUIInfoPtr = Marshal.AllocHGlobal(length);
Marshal.StructureToPtr(uiRestrictions, basicUIInfoPtr, false);
if (!SetInformationJobObject(handle, JobObjectInfoType.BasicUIRestrictions, basicUIInfoPtr, (uint)length))
throw new Exception(string.Format("Unable to set information. Error: {0}", Marshal.GetLastWin32Error()));
}
然后在主程序中我执行以下操作:
Job j = new Job("NewJob");
j.AddProcess(ProcID);
其中ProcID是我要将作业添加到的进程的ID。在尝试添加之前,我会检查进程是否已经有一个工作。除此之外,我没有得到任何异常错误,正如我所说的SysInternalstool,进程资源管理器将新工作附加到该过程。
有任何想法吗?