SOLIDWORKS PDM Professional API Help

Traverse Users and Groups in Vault Example (C#)

This example shows how to traverse the users and groups in a vault and send a message, also called a notification, to all logged-in users of the vault.

NOTE: If using the primary interop assembly provided with SOLIDWORKS PDM Professional, see Using .NET Framework 4.0 in Stand-alone Applications.

//----------------------------------------------------------------------------
// Preconditions:
// 1. Start Microsoft Visual Studio.
//    a. Click File > New > Project > C# > Windows Forms Application.
//    b. Type UsersAndGroupsCSharp in Name.
//    c. Click Browse and navigate to the folder where to create the project.
//    d. Click OK
//    e. Click Show All Files in the Solution Explorer toolbar and expand 
//       Form1.cs in the Solution Explorer.
//    f. Replace the code in Form1.cs with this code.
//    g. Replace the code in Form1.Designer.cs with this code.
// 2. Add EPDM.Interop.epdm.dll as a reference (right-click the project
//    name in the Solution Explorer, click Add Referenceclick 
//    Assemblies > Framework in the left-side panel, browse to the top folder 
//    of your SOLIDWORKS PDM Professional installation, locate and click 
//    EPDM.Interop.epdm.dll, click Open, click Add, and click Close).
// 3. Right-click EPDM.Interop.epdm in References, click Properties, and set 
//    Embed Interop Types to False to handle methods that pass arrays of 
//    structures.
// 4. Ensure that the vault contains one or more users and one or more
//    workflows.

// 5. Click Debug > Start Debugging or press F5.
//
// Postconditions: 
//  1. Displays a dialog.
//  2. Select a vault.
//  3. Click Traverse users.
//     Three message boxes report:
//     * users
in the vault,
//     * state permissions for a user in the vault,
//       - and -
//     * transition permissions for a user in the vault.

//  4. Click OK to close each message box.
//  5. Click Traverse groups.
//     A message box reports the groups in the vault.
//  6. Click OK to close the message box.
//  7. Click Traverse group members.
//     A message box reports the users of each group in the vault.
//  8. Click OK to close the message box.
//  9. Click Send consultation request.
//     After several minutes, a SOLIDWORKS PDM Professional notification 
//     appears only to logged-in users. 
// 10. To open the the message, click:

//     * the notification while it is displayed,
//     * the SOLIDWORKS PDM Professional tray icon,

//       - or -
//     * Tools > Inbox in the vault view.
// 11. Close the dialog.

//----------------------------------------------------------------------------
//Form1.cs 
using System.IO;
using System.Xml.Serialization;
using EPDM.Interop.epdm;
using System.Windows.Forms;
using System.Runtime.InteropServices;
 
namespace UsersAndGroupsCSharp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        void UsersAndGroupsCSharp_Load(System.Object sender, System.EventArgs e)
        {
 
            IEdmVault8 vault = (IEdmVault8)new EdmVault5();
            EdmViewInfo[] Views = { };
 
            vault.GetVaultViews(out Views, false);
            VaultsComboBox.Items.Clear();
            foreach (EdmViewInfo View in Views)
            {
                VaultsComboBox.Items.Add(View.mbsVaultName);
            }
            if (VaultsComboBox.Items.Count > 0)
            {
                VaultsComboBox.Text = (string)VaultsComboBox.Items[0];
            }
        }
 

        private void TraverseUsersButton_Click(System.Object sender, System.EventArgs e)

        {
                IEdmVault5 vault = new EdmVault5();
                IEdmVault7 vault1 = null;
 
                if (vault == null)
                {
                    vault = new EdmVault5();
                }
 
                vault1 = (IEdmVault7)vault;
 
                //Log into selected vault as the current user
                vault1.LoginAuto(VaultsComboBox.Text, this.Handle.ToInt32());
 
                //Declare an IEdmUserMgr9 object
                IEdmUserMgr9 UserMgr = default(IEdmUserMgr9);
                UserMgr = vault1.CreateUtility(EdmUtility.EdmUtil_UserMgr);
 
                EdmStatePermission[] ppoPermissions = {
 
    };
                EdmTransitionPermission[] ppoTransitionPermissions = {
 
    };
 
                string Users = null;
                IEdmPos5 UserPos = default(IEdmPos5);
                IEdmUser5 User = default(IEdmUser5);
                UserPos = UserMgr.GetFirstUserPosition();
                while (!UserPos.IsNull)
                {
                    User = UserMgr.GetNextUser(UserPos);
                    Users = Users + User.Name + " ID: " + User.ID + "\n";
                }
 
                MessageBox.Show(Users, vault1.Name + " Vault Users"MessageBoxButtons.OK, MessageBoxIcon.Information);
 
                //Get permissions for all states for a user 
                UserMgr.GetStatePermissions(User.ID, EdmObjectType.EdmObject_User, 0, out ppoPermissions);
                string str = null;
                str = "EdmStatePermissions for a user in the vault" + "\n";
                str = str + "\n";
                foreach (EdmStatePermission item in ppoPermissions)
                {
 
                   str = str + "mlOwnerID: " + item.mlOwnerID + "\n";
                    str = str + "meOwnerType (EdmObjectType.EdmObject_User (7) or EdmObjectType.EdmObject_UserGroup (8)): " + item.meOwnerType + "\n";
                    str = str + "mlStateID: " + item.mlStateID + "\n";
                    str = str + "mlEdmRightFlag as defined in EdmRightFlags: " + item.mlEdmRightFlag + "\n";
                    str = str + "\n";
 
                }
                MessageBox.Show(str);
 
                //Get permissions for all transitions for a user 
                UserMgr.GetTransitionPermissions(User.IDEdmObjectType.EdmObject_User, 0, out ppoTransitionPermissions);
                str = "EdmTransitionPermissions for a user in the vault" + "\n";
                str = str + "\n";
                foreach (EdmTransitionPermission item in ppoTransitionPermissions)
                {
 
                    str = str + "mlOwnerID: " + item.mlOwnerID + "\n";
                    str = str + "meOwnerType (EdmObjectType.EdmObject_User (7) or EdmObjectType.EdmObject_UserGroup (8)): " + item.meOwnerType + "\n";
                    str = str + "mlTransitionID: " + item.mlTransitionID + "\n";
                    str = str + "mlEdmRightFlag as defined in EdmTransitionRightFlags: " + item.mlEdmRightFlag + "\n";
                    str = str + "\n";
 
                }
                MessageBox.Show(str);
        }
        
 
        private void TraverseGroupsButton_Click(System.Object sender, System.EventArgs e)
        {
 
            //Declare and create an instance of IEdmVault5 object
            IEdmVault5 vault = new EdmVault5();
            //Log into selected vault as the current user
            vault.LoginAuto(VaultsComboBox.Text, this.Handle.ToInt32());
 
            //Declare an IEdmUserMgr5 object
            IEdmUserMgr5 UserMgr = default(IEdmUserMgr5);
            //The IEdmUserMgr5 interface is implemented by the
            //same class as the IEdmVault5 interface,
            //so assign the value of the IEdmVault5 object
            UserMgr = (IEdmUserMgr5)vault;
 
            string Groups = "";
            IEdmPos5 UserGroupPos = default(IEdmPos5);
            UserGroupPos = UserMgr.GetFirstUserGroupPosition();
            while (!UserGroupPos.IsNull)
            {
                IEdmUserGroup5 UserGroup = default(IEdmUserGroup5);
                UserGroup = UserMgr.GetNextUserGroup(UserGroupPos);
                Groups = Groups + UserGroup.Name + "\n";
            }
            MessageBox.Show(Groups, vault.Name + " Vault Groups"MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
 
        private void TraverseGroupMembersButton_Click(System.Object sender, System.EventArgs e)
        {
 
            //Declare and create an instance of IEdmVault5 object
            IEdmVault5 vault = new EdmVault5();
            //Log into selected vault as the current user
            vault.LoginAuto(VaultsComboBox.Text, this.Handle.ToInt32());
 
            //Declare an IEdmUserMgr5 object
            IEdmUserMgr5 UserMgr = default(IEdmUserMgr5);
            //The IEdmUserMgr5 interface is implemented by the 
            //same class as the IEdmVault5 interface, 
            //so assign the value of the IEdmVault5 object
            UserMgr = (IEdmUserMgr5)vault;
 
            string Groups = "";
            IEdmPos5 UserGroupPos = default(IEdmPos5);
            UserGroupPos = UserMgr.GetFirstUserGroupPosition();
            while (!UserGroupPos.IsNull) {
                IEdmUserGroup5 UserGroup = default(IEdmUserGroup5);
                UserGroup = UserMgr.GetNextUserGroup(UserGroupPos);
                Groups = Groups + UserGroup.Name + ":\n";
                Groups = Groups + GetMembers(UserGroup);
            }
            MessageBox.Show(Groups, vault.Name + " Vault Group and Users"MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
 
        private string GetMembers(IEdmUserGroup5 UserGroup)
        {
            string functionReturnValue = null;
 
            functionReturnValue = "";
            string Users = "";
            IEdmPos5 UserPos = default(IEdmPos5);
            UserPos = UserGroup.GetFirstUserPosition();
            while (!UserPos.IsNull)
            {
                IEdmUser5 User = default(IEdmUser5);
                User = UserGroup.GetNextUser(UserPos);
                Users = Users + " " + User.Name + "\n";
            }
            functionReturnValue = Users;
            return functionReturnValue;
        }
 
        private void SendConsultationRequestButton_Click(System.Object sender, System.EventArgs e)
        {
 
            //Declare and create an instance of IEdmVault5 object
            IEdmVault5 vault = new EdmVault5();
            //Log into selected vault as the current user
            vault.LoginAuto(VaultsComboBox.Text, this.Handle.ToInt32());
 
            //Declare an IEdmUserMgr5 object
            IEdmUserMgr5 UserMgr = default(IEdmUserMgr5);
            //The IEdmUserMgr5 interface is implemented by the
            //same class as the IEdmVault5 interface,
            //so assign the value of the IEdmVault5 object
            UserMgr = (IEdmUserMgr5)vault;
 
            IEdmUserGroup5 UserGroup = default(IEdmUserGroup5);
            UserGroup = UserMgr.GetUserGroup("All Users");
            if ((UserGroup != null))
            {
                IEdmPos5 UserPos = default(IEdmPos5);
                UserPos = UserGroup.GetFirstUserPosition();
                while (!UserPos.IsNull)
                {
                    IEdmUser5 User = default(IEdmUser5);
                    User = UserGroup.GetNextUser(UserPos);
                    if (User.IsLoggedIn)
                    {
                        User.SendMsg("Informal review request""Please stop by my office sometime " + "this morning for a quick informal " + "review of my design changes before " + "I submit them for approval.");
                    }
                }
            }
        }
    }
}

Back to top
\\Form1.Designer.cs
namespace UsersAndGroupsCSharp
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">True if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region Windows Form Designer generated code
 
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.VaultsLabel = new System.Windows.Forms.Label();
            this.VaultsComboBox = new System.Windows.Forms.ComboBox();
            this.TraverseUsersButton = new System.Windows.Forms.Button();
            this.TraverseGroupsButton = new System.Windows.Forms.Button();
            this.TraverseGroupMembersButton = new System.Windows.Forms.Button();
            this.SendConsultationRequestButton = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // VaultsLabel
            // 
            this.VaultsLabel.AutoSize = true;
            this.VaultsLabel.Location = new System.Drawing.Point(26, 24);
            this.VaultsLabel.Name = "VaultsLabel";
            this.VaultsLabel.Size = new System.Drawing.Size(91, 13);
            this.VaultsLabel.TabIndex = 0;
            this.VaultsLabel.Text = "Select vault view:";
            // 
            // VaultsComboBox
            // 
            this.VaultsComboBox.FormattingEnabled = true;
            this.VaultsComboBox.Location = new System.Drawing.Point(29, 51);
            this.VaultsComboBox.Name = "VaultsComboBox";
            this.VaultsComboBox.Size = new System.Drawing.Size(168, 21);
            this.VaultsComboBox.TabIndex = 1;
            // 
            // TraverseUsersButton
            // 
            this.TraverseUsersButton.Location = new System.Drawing.Point(29, 92);
            this.TraverseUsersButton.Name = "TraverseUsersButton";
            this.TraverseUsersButton.Size = new System.Drawing.Size(168, 36);
            this.TraverseUsersButton.TabIndex = 2;
            this.TraverseUsersButton.Text = "Traverse users";
            this.TraverseUsersButton.UseVisualStyleBackColor = true;
            this.TraverseUsersButton.Click += new System.EventHandler(this.TraverseUsersButton_Click);
            // 
            // TraverseGroupsButton
            // 
            this.TraverseGroupsButton.Location = new System.Drawing.Point(29, 151);
            this.TraverseGroupsButton.Name = "TraverseGroupsButton";
            this.TraverseGroupsButton.Size = new System.Drawing.Size(168, 39);
            this.TraverseGroupsButton.TabIndex = 3;
            this.TraverseGroupsButton.Text = "Traverse groups";
            this.TraverseGroupsButton.UseVisualStyleBackColor = true;
            this.TraverseGroupsButton.Click += new System.EventHandler(this.TraverseGroupsButton_Click);
            // 
            // TraverseGroupMembersButton
            // 
            this.TraverseGroupMembersButton.Location = new System.Drawing.Point(29, 210);
            this.TraverseGroupMembersButton.Name = "TraverseGroupMembersButton";
            this.TraverseGroupMembersButton.Size = new System.Drawing.Size(168, 41);
            this.TraverseGroupMembersButton.TabIndex = 4;
            this.TraverseGroupMembersButton.Text = "Traverse group members";
            this.TraverseGroupMembersButton.UseVisualStyleBackColor = true;
            this.TraverseGroupMembersButton.Click += new System.EventHandler(this.TraverseGroupMembersButton_Click);
            // 
            // SendConsultationRequestButton
            // 
            this.SendConsultationRequestButton.Location = new System.Drawing.Point(29, 279);
            this.SendConsultationRequestButton.Name = "SendConsultationRequestButton";
            this.SendConsultationRequestButton.Size = new System.Drawing.Size(168, 35);
            this.SendConsultationRequestButton.TabIndex = 5;
            this.SendConsultationRequestButton.Text = "Send consultation request";
            this.SendConsultationRequestButton.UseVisualStyleBackColor = true;
            this.SendConsultationRequestButton.Click += new System.EventHandler(this.SendConsultationRequestButton_Click);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 342);
            this.Controls.Add(this.SendConsultationRequestButton);
            this.Controls.Add(this.TraverseGroupMembersButton);
            this.Controls.Add(this.TraverseGroupsButton);
            this.Controls.Add(this.TraverseUsersButton);
            this.Controls.Add(this.VaultsComboBox);
            this.Controls.Add(this.VaultsLabel);
            this.Name = "Form1";
            this.Text = "Traverse users and groups";
            this.Load += new System.EventHandler(this.UsersAndGroupsCSharp_Load);
            this.ResumeLayout(false);
            this.PerformLayout();
 
        }
 
        #endregion
 
        private System.Windows.Forms.Label VaultsLabel;
        private System.Windows.Forms.ComboBox VaultsComboBox;
        private System.Windows.Forms.Button TraverseUsersButton;
        private System.Windows.Forms.Button TraverseGroupsButton;
        private System.Windows.Forms.Button TraverseGroupMembersButton;
        private System.Windows.Forms.Button SendConsultationRequestButton;
    }
}
 
Back to top