I'm working in C# but have no issues getting Python responses.
It's a nested class within Project and it's where Company info, Office user and Field user is stored. It also appears to support adding your own properties through the UserInfoCollection property.You can create a new instance with var userInfo = new Project.ProjectUserInfo(_project). It exposes properties for all the expected fields, so userInfo.CompanyAddress1 = "Some Text" doesn't cause an issue for the compiler, but when debugging, nothing changes (i.e. userInfo.CompanyAddress1 doesn't reflect the new value in the Locals window. There is no SetValue(...) method either, though there is GetValue() and Add().ProjectUserInfo doesn't implement ISnapIn, so I can't get the 'official' one that way, nor does it have a Provide() method like FeatureCodeManager. Project doesn't have a property of type ProjectUserInfo, nor is ProjectUserInfo a MandatoryContainer. I haven't looked at Concordance yet, but we aren't dealing with field data so doubt that's the solution. It does have ReadBody() and WriteBody() methods but I've never seen a macro use those methods - I believe that are called by the Transaction Manager and aren't for us to mess with.
How do I work with this object? All I want to do is save some common settings and have them persist. I feel like I have to get and give a ProjectUserInfo object from / to some service.
Whoops that was dumb. Project.UserInfo is of type IProjectUserInfo and works fine.