My app adds some custom metadata to files. I want to display it in Windows Explorer like this:
or this:
Is there a way to do this in .NET?
There are two approaches to building custom columns in Windows File Manager: using Windows Property System and Property Definitions for Cloud Storage Provider. You will typically use the first approach to create custom properties for file types that you own. You will use the second approach when displaying custom data from your document management system or any other storage.
Using a Windows Property System.
You can create custom properties for specific file types in Windows Vista and later versions. These properties can be read-only or read-write. As well as they can be indexed by Window Search indexer and participate in the search. There are some limitations:
Microsoft clearly says that property handlers must be in C++, it can not be in .NET:
...property handlers cannot be implemented in managed code and should be
implemented in C++.
The property is tied to the specific file type, which typically belongs to your application. You can not create a property for all file types.
Using Cloud Storage Provider Property Definitions
In Windows 10 Creators Update and later you can add custom columns for file systems created using Cloud Sync Engine API (Storage Provider, Cloud Filter API). This API is used in such tools as OneDrive. You will need to register a Cloud Storage Provider sync root with custom properties definitions, provide data for your custom columns and finally implement a Cloud Storage provider using Cloud File/Cloud Filter API.
Property definitions are not tied to a file type and can be added for all files. Also, even though only some API is available in .NET you still can call Win32 functions and build a cloud provider using managed code only.
Registering the Cloud Storage provider. Here is an example of the Storage Provider registration with custom columns in C#:
StorageProviderSyncRootInfo storageInfo = new StorageProviderSyncRootInfo();
storageInfo.Path = await StorageFolder.GetFolderFromPathAsync("C:\\Users\\User1\\VFS\\");
...
// Adds columns to Windows File Manager.
// Show/hide columns in the "More..." context menu on the columns header.
var proDefinitions = storageInfo.StorageProviderItemPropertyDefinitions;
proDefinitions.Add(new StorageProviderItemPropertyDefinition { DisplayNameResource = "Lock Expires", Id = 2, });
proDefinitions.Add(new StorageProviderItemPropertyDefinition { DisplayNameResource = "Lock Scope", Id = 3, });
StorageProviderSyncRootManager.Register(storageInfo);
A complete registration example could be found here.
Providing data for property definitions. To provide the data for the columns you will use StorageProviderItemProperties.SetAsync() call:
IStorageItem storageItem = await Windows.Storage.StorageFile.GetFileFromPathAsync(path);
StorageProviderItemProperty propState = new StorageProviderItemProperty()
{
Id = 3,
Value = "Exclusive",
IconResource = "C:\\path\\icon.ico" // The optional icon to be displayed in the Status column.
};
await StorageProviderItemProperties.SetAsync(storageItem, new StorageProviderItemProperty[] { propState });
Another approach would be implementing IStorageProviderItemPropertySource interface. It returns properties based on your file path.
Cloud Storage Provider implementation. Finally, you will need a complete file system implementation, supplying data for your files/folders placeholders. You can find complete examples in .NET/C# here:
This post is marked obsolete because the content is out of date. It is not currently accepting new interactions.
PLEASE PAY ATTENTION: THIS ANSWER IS FOR XP AND VISTA ONLY, IT IS OUTDATED
It can be done on XP using a Column Handler shell extension - see here:
http://www.codeproject.com/Articles/3747/Explorer-column-handler-shell-extension-in-C#
However IColumnHandler is not supported on Vista and up. Here you have to implement PropertyHandler. See Windows SDK \Samples\winui\Shell\AppShellIntegration\PropertyHandlers.
Each property is described by property schema XML file. This property schema must be registered with PSRegisterPropertySchema(). Property handler implements IInitializeWithXXX, IPropertyStore and optionally IPropertyStoreCapabilities. You have to register CLSID of your implementation for each file extension you want to handle.
Unfortunately, you cannot use AllFileSystemObject or * in registration.
Related
Some new fields were create in Dynamics CRM.
Now need to push some data to those new fields from asp.net website.
Need to add those new fields to:
[assembly: Microsoft.Xrm.Sdk.Client.ProxyTypesAssemblyAttribute()]
namespace Xrm
how should this be done? I read that these is a tool that generates this class file (CrmSvcUtil.exe).
But I do not understand how this would work.
Is this something that need to be done through Dynamics CRM admin?
Please advise.
Thanks
This should be done by user which has System Administrator or System Customizer, because this user has to have access to all entities metadata.
Basically you should start with downloading CRM SDK, for your version of CRM. For example the latest SDK can be found here:
https://www.microsoft.com/en-us/download/details.aspx?id=50032
Install the SDK and go to the bin folder inside the folder where you installed it. There you can find crmsvcutil.exe. This tool is something like svcutil.exe - it simply generates proxy classes using CRM metadata service. So instead of referring to Account entity like that:
var account = new Entity("account")
you can simply do:
var account = new Account();
and you will have all the properties that account in your system has.
In order to generate this classes just run crmsvcutil.exe using windows command line with proper credentials (it's very well documented if you run it without any parameters). example usage would be:
crmsvcutil /url:https://orgname.api.crm4.dynamics.com/XRMServices/2011/Organization.svc /u:user#orgname.onmicrosoft.com /p:password /serviceContextName:XrmServiceContext /out:Proxies.cs /n:Xrm
this would generate file Proxies.cs, containing namespace Xrm (the one you have posted in your question) with all the entities and fields. Of course the parameters may vary based on what type of organization you are connecting to. If you have problems with specifying proper values then simply put /il as last command line parameter - it will open an interactive login form, that would make it simpler for you to pass proper connection data.
I've been looking into using the Graph API from Microsoft to monitor a few online Exchange inboxes.
I was reading their documentation here for Outlook Messages but I'm looking for conversationTopic. I know this is exposed in the normal Outlook Object Model; but I don't see it exposed in their documentation.
Has MS exposed this property in their API?
Info as of 9/15/2016
The conversationThread property has only been exposed in group conversations. It hasn't been exposed in a first class manner for a user's messages. This has been exposed on the beta endpoint via extended properties . You'll want to use the PidTagConversationTopic property.
Here's an example call to get this property (you'll just need to add your message id):
https://graph.microsoft.com/beta/me/messages('YOURMESSAGEID')?$expand=singleValueExtendedProperties($filter=id%20eq%20'String%200x0070')
Here it is for easier reading (no URL encoding):
https://graph.microsoft.com/beta/me/messages('YOURMESSAGEID')?$expand=singleValueExtendedProperties($filter=id eq 'String 0x0070')
I'm currently developing a custom Membership provider using the DirectoryServices API to interface with a OpenLdap server (running on a cloud based Ubuntu instance) to handle authentication for our new website. However I'm running into an issue where we need to access some of the operational attributes e.g. reading 'pwdAccountLockedTime' to see if the user account is locked or removing it to unlock the user account.
I have tried adding the required attributes to the DirectorySearcher's PropertiesToLoad collection, but this does not seem to load the required properties into the DirectoryEntry when we load it from the SearchResult.
In Novell (which we used previously) we could specify the string array { "*", "+" } when searching or reading to load the entry with all attributes (including the operational ones), but this doesn't seem to work in Directory Services.
We are currently using the Mono framework as our servers are running on Ubuntu instances, and the Mono project status for System.DirectoryServices currently reports as complete (apart from 2 namespaces that we aren't using), so we're not too sure if this is a Mono bug (it wouldn't be the first we've found in some of the lesser used libraries) or if we are using the DirectoryServices API incorrectly.
Long question short, how do you correctly load operational attributes when using the DirectoryServices API?
Turns out the additional requested attributes are loaded (and { "*", "+" } does work), its just that instead of the attributes being loaded into the DirectoryEntry's Properties collection, they are instead (for some reason) only loaded into the Properties collection of the SearchResult, and not into the DirectoryEntry.
I am writing a custom piece of code that dynamically creates modified document libraries. I've attempted to create a document library template, which succeeds in the UI but cannot be found via-webservices.
So to get to the point - I am attempting to:
1. Set "Allow Management Of Content Types" on the list.
2. Add a new Content Type (Already Created) to the list.
3. Set the new content type as the default content type.
4. Remove the "Document" content type from the list.
So far I have succeeded in being able to "Apply" the custom content type but the others are evading my grasp. The methods I have attempted are through the Lists.asmx service and the method described here: http://msdn.microsoft.com/en-us/library/websvclists.lists.updatelist.aspx
I tried setting the Flags property and a few other potential candidates with no success and no error messages complaining about what I was trying to attempt.
One limitation is that I do NOT have access to the sharepoint dll where this is living.
Once completed - this would be a plugin living in another non-sharepoint system. The only option to include the SharePoint client dll's would be to perform an ILMerge.
EDIT:
http://msdn.microsoft.com/en-us/library/sharepoint/jj193051.aspx (SharePoint 2013 Web Services)
http://msdn.microsoft.com/en-us/library/ee705814(v=office.16).aspx (SharePoint 2010 Web Services)
and yes - technically the ASMX services sound like they're on their way out: http://msdn.microsoft.com/en-us/library/sharepoint/jj164060.aspx
Edit: Tags are relevant to the question.
use SharePoint Client Object Model. This is a library that wraps calls to webservices that allows among other things to batch commands.
The operations you mention are all available.
here is a link to an article that explains Client Object Model:
http://www.codeproject.com/Articles/399156/SharePoint-2010-Client-Object-Model-Introduction
The article focus on ListItems but you can also interact with list properties, even web properties if you want.
Please note that you don't need to run Client Object Model from your sharepoint server. Note the "Client" part in the name.
I am using the SharePoint Copy web service to upload a file to a document library. The library is using a content type that contains a managed metadata field. I can not figure out how to update this field by using the FieldInformation class. I have not had any issues setting any of the other fields using this method. An example of how I am uploading the file with the FileInformation can be found here
I have tried to set the field via its Display Name as well as the "hidden" note field with the same name plus 0.
SharePointCopyWebService.FieldInformation fieldInfo = new SharePointCopyWebService.FieldInformation();
fieldInfo.DisplayName = "Internal Audit Topics_0";
fieldInfo.Type = SharePointCopyWebService.FieldType.Note;
fieldInfo.Value = "Known Term";
fieldInfoArray.Add(fieldInfo);
Additional Info:
This is running inside a Win Forms application
I am not allowed to use the SharePoint Server/Client Object Models
Any ideas on how to update the managed metadata field with the FieldInformation class?
The managed metadata field has a format similar to the lookup field (i.e. "id;#value") except it requires the guid of the term label e.g. "id;#TermLabel|xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
This will work, but forcing external applications to know the correct value of the guids pretty much ruins this feature for updating from external systems.