簡體   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