5

質問にあるように、送信時にac#ワークフローを使用してSP2010で実行されているInfoPathフォームがあります。ワークフロー中にフォームが拒否された場合は、リセットする必要があります。デジタル署名をnull、nill、nada、nothing、non-extentにリセットする方法を除いて、私はすべてを管理しています。何か案は?私は今グーグルを見ています、しかし現在、私はデジタル署名のためのomさえ確信がありませんか?

うわー、私はこの質問が突然たくさんのポップを獲得し、賞金がほとんどなくなっていることに気づきました。ただそれを出すだけで、誰かに報奨金を払わないつもりはありませんでしたが、今週初め(2012年11月第2週)に答えが必要だったので、自分のコードを見つけるまで、可能な限りコードを検索して遊んだり、いじめたりしました誰もが私に答える前に答えなさい。しかし、将来の参考のために、誰かがより良い答えを与えた場合、私は喜んで戻ってきて彼らを担当します。たくさんのご支援ありがとうございました。私の答えが私と同じように他の人にも役立つことを心から願っています。

NOW Bloggered && Gisted この答えを探すのに、これほど一生懸命検索する必要がなくなるかもしれません:P

4

2 に答える 2

2

¡¡¡私はMYFRIGGINの答えを見つけました!!!

¡¡¡そしてそれはワークフローから動作します!!!

多くの試練と苦難を経て、私はついに解決策を思いつくことができました。それはいくつかのステップを含みます。1つは、セキュリティを強化することです。そうしないと、管理者以外のユーザーがワークフローでエラーを発生させます。このように機能するようですが...次に、適切なスキーマを取得してください。私の物を見つけるのに少し時間がかかりました。正確な手順を忘れましたが、見つけるのは難しくありません。 UPDATED: Can be found as an attribute of xmlDoc.Document, see updated code名前空間/スキーマを使用せずにワークフローをステップスルー(デバッグ)し、ドキュメントに到達したら強調表示します。プロパティの1つは、スキーマリンクである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();
});

この設定は、複数の署名を通過するためのものであることに注意してください。署名が1つしかない場合、何かが変わるとは思えませんが。

これをより甘く、より小さくするための提案は受け入れられますが、私は説明を要求しなければなりません。正直なところ、私はここで何が起こっているのかほとんど理解していません!

于 2012-11-07T22:20:09.100 に答える
1

次の回答は HALF のみが機能します。これは教育目的でここに残されています。(完全な実用的な答えはここにあります。)管理者ユーザーには機能しますが、それ以下ではありません。また、InfoPath フォーム ビハインド コードからのみ機能します。ワークフローからではありません。 昇格した特権を追加しても効果がないようです

誰かが両方の例から学ぶか、コメントを介して他の人 (私を含む) に指示することさえできるように、この回答を他の回答と一緒にここに残しておきます。この時点で、このコードを二度と見たくないので、これ以上説明する必要はありません。笑!

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 に答える