繁体   English   中英

如何在Sharepoint 2010中的c#工作流程中重置InfoPath表单的数字签名?

[英]How to reset digital signature of an InfoPath form during c# workflow in Sharepoint 2010?

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

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

现在 Bloggered && Gisted 可能再没有人像我对这个答案那样努力搜索,:P

我发现了一个AN AN AN AN AN AN AN AN AN AN!!!!!!!

从工作流程开始工作!!!

通过大量的试炼和磨难,我终于能够找到解决方案。 它涉及几个步骤。 一,提升安全性! 否则,非管理员用户将导致工作流程出错。 看起来它应该以这种方式工作,但是......其次,获得正确的架构! 我花了一段时间找到我的, 我忘记了确切的步骤,但是,这并不难找到。 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();
});

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

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

以下答案仅适用于HALF。 它留在这里用于教学目的。 完整的工作答案可以在这里找到。 )它适用于管理员用户,但没有更少。 它也只能在代码后面的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) { };
                };
            };
        };
    };
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM