5

正如问题所说,我有一个在 SP2010 上运行的 InfoPath 表单,提交时使用 ac# 工作流。如果表单在工作流程中被拒绝,那么我需要重置它。我控制了一切,除了如何将数字签名重置为 null、nill、nada、什么都没有、不存在!有任何想法吗?我现在在看谷歌,但目前,我什至不确定数字签名的 om?

哇,我注意到这个问题突然变得越来越流行,赏金几乎消失了。只是把它放在那里,我不打算不赏金某人,但我本周早些时候(2012 年 11 月第 2 周)需要答案,因此我尽可能多地搜索、玩和摇摇欲坠的代码,直到我最终找到自己的在其他人回答我之前回答。但是,为了将来参考,如果有人给出更好的答案,我很乐意回来并代表他们。谢谢大家的支持,我真的希望我的回答对别人和对我一样有用。

NOW Bloggered && Gisted 可能再也没有人像我一样努力搜索这个答案了,:P

4

2 回答 2

2

¡¡¡ 我找到了我的答案!!!

¡¡¡ 它适用于工作流程!

历经千辛万苦,我终于想出了一个解决办法。它涉及几个步骤。一、提升安全!否则,非管理员用户将导致工作流程出错。似乎它应该以这种方式工作,但是......其次,获得正确的架构!我花了一段时间才找到我的,我忘记了确切的步骤,但是,它并不难找到。 UPDATED: Can be found as an attribute of xmlDoc.Document, see updated code单步执行(调试)您的工作流程,无需命名空间/架构,并在文档到达时突出显示它。其中一个属性是作为架构链接的 url。无论如何,你想看看解决方案!?是吗?向下看!

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    SPFile formFile = workflowProperties.Item.File;
    MemoryStream ms = new MemoryStream(formFile.OpenBinary());
    XmlTextReader rdr = new XmlTextReader(ms);
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(rdr);
    rdr.Close();
    ms.Close();
    XmlNamespaceManager nsm = new XmlNamespaceManager(xmlDoc.NameTable);
    String schemaUri = xmlDoc.DocumentElement.GetAttributeNode("xmlns:my") != null ? xmlDoc.DocumentElement.GetAttributeNode("xmlns:my").Value : "http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-09-04T20:19:31";
    nsm.AddNamespace("my", schemaUri);
    XmlNode nodeSignatureCollection = xmlDoc.DocumentElement.SelectSingleNode("my:signatures1", nsm);
    if (nodeSignatureCollection != null)
    {
        if (nodeSignatureCollection.HasChildNodes)
        {
            foreach (XmlNode nodeSignature in nodeSignatureCollection.ChildNodes)
            {
                //  HERE IT IS!!!
                if (nodeSignature.HasChildNodes && !nodeSignature.IsReadOnly) nodeSignature.RemoveAll();
            }
        }
    }
    byte[] xmlData = System.Text.Encoding.UTF8.GetBytes(xmlDoc.OuterXml);
    formFile.SaveBinary(xmlData);
    formFile.Update();
});

请记住,此设置用于通过多个签名。虽然我怀疑如果只有一个签名会改变任何事情。

任何关于使这个更甜更小的建议都被接受,但是,我必须要求解释。老实说,我几乎不明白这里发生了什么!

于 2012-11-07T22:20:09.100 回答
1

以下答案只有一半有效。它留在这里用于教学目的。(完整的工作答案可以在这里找到。)它适用于管理员用户,但仅此而已。它也仅适用于代码背后的 InfoPath 表单。不是来自工作流程。 添加提升的特权似乎有 0 效果

我将把这个答案和我的另一个答案一起留在这里,以便有人可以从这两个例子中学习,甚至可能通过评论指导其他人(包括我自己),以及为什么一种方法可能比另一种更好。在这一点上,我真的不想再解释了,因为我真的不想再看到任何这段代码了!哈哈!

public void FormEvents_Loading(object sender, LoadingEventArgs e)
{
    string[] actionFields = new string[] { "/my:myFields/my:.../my:...", "/my:myFields/my:.../my:...", etc... };
    for (int i = 0; i < actionFields.Length; i++)
    {
        String field = actionFields[i];
        XPathNavigator node = this.MainDataSource.CreateNavigator().SelectSingleNode(field, this.NamespaceManager);
        if (node.Value.ToLower() == "reject")
        {
            XPathNavigator sigNode = this.MainDataSource.CreateNavigator();
            if (this.Signed) //then unsign it
            {
                for (int ii = 2; ii <= 13; ii++)
                {
                    try
                    {
                        XPathNavigator xSignedSection = sigNode.SelectSingleNode(String.Format("my:myFields/my:signatures1/my:signatures{0}", ii), this.NamespaceManager);
                        if (xSignedSection.HasChildren)
                        {
                            xSignedSection.MoveToChild(XPathNodeType.Element); xSignedSection.DeleteSelf();
                        };
                    }
                    catch (Exception ex) { };
                };
            };
        };
    };
}
于 2012-11-05T16:08:32.577 回答