J'ai une situation où les gens sont connectés à des fichiers sur une part et que cela me bloque d'écraser le fichier. J'essaie d'écrire une méthode qui cherchera à voir si un filépathe que je fournis est actuellement verrouillé de cette manière et fermez la session réseau de cette ressource. P>
J'ai regardé le fournisseur de Winnt ADSI, mais le membre Resources.ReMove n'est pas implémenté. Ensuite, j'ai regardé Win32_Serversession et pendant que je suis capable d'utiliser Supprimer membre, il tue toutes les ressources pour un utilisateur donné. Je dois savoir comment être plus précis. P>
Je fais de la marche GetReleShips et des propriétés mais je suis juste coupé pour le moment. P>
3 Réponses :
Il serait difficile de considérer toutes les ramifications de le faire car vous ne pouvez pas nécessairement prédire le comportement résultant de l'application qui a actuellement le fichier verrouillé. p>
Y a-t-il une autre façon de faire cela? Par exemple, devez-vous remplacer le fichier immédiatement ou avoir un processus externe qui essaiera continuellement à écraser le fichier toutes les quelques minutes jusqu'à ce qu'il réussisse? P>
Je vais vous donner le "ne fais pas ça". :-) Je sais que je n'ai pas donné les raisons pour lesquelles j'ai besoin de le faire, mais ils étaient réels. Fortunatly j'ai remis la tâche à quelqu'un d'autre. :-)
J'ai fait face au même problème. Jusqu'à présent, je sais que la seule façon de le faire, utilise le Win32API:
[DllImport("Netapi32.dll", SetLastError=true, CharSet = CharSet.Unicode)] public static extern int NetFileClose(string servername, int id);
Vous pouvez utiliser le code que vous fournissez le chemin d'accès complet à la liste de fichiers et de renvoyer une liste
public static void remoteProcessKill(string computerName, string fullUserName, string pword, string processName)
{
var connectoptions = new ConnectionOptions();
connectoptions.Username = fullUserName; // @"YourDomainName\UserName";
connectoptions.Password = pword;
ManagementScope scope = new ManagementScope(@"\\" + computerName + @"\root\cimv2", connectoptions);
// WMI query
var query = new SelectQuery("select * from Win32_process where name = '" + processName + "'");
using (var searcher = new ManagementObjectSearcher(scope, query))
{
foreach (ManagementObject process in searcher.Get())
{
process.InvokeMethod("Terminate", null);
process.Dispose();
}
}
}
Je n'ai aucune idée si vous pouvez même le faire - et si vous le pouvez, c'est sage? Alternative - Pouvez-vous envoyer un message à l'utilisateur en quelque sorte - email, via l'application, etc.?
Salut chris. À mon avis, le déploiement automatiquement au-dessus des fichiers de ressources en lecture / écriture sur un réseau est toujours faux. Le seul cas que je ferais, c'est si les fichiers eux-mêmes sont tous en lecture seule par conception - mais à nouveau comme des développeurs d'installation, nous sommes toujours confrontés à la mentalité "juste le faire". J'ai mis en place un vérificateur pour écrit aux fichiers d'un partage réseau utilisant C # et FileSystemwatcher. Cela n'a jamais fonctionné car les événements soulevés sont différents selon le matériel de sous-couche. Voici quelques détails: codeProject.com/kb/files/.../ a>
En fait, cette question n'avait rien à voir avec le déploiement / la configuration. C'était une situation dans laquelle une construction automatisée essayait d'archiver à un dossier connu et qu'il y avait des fichiers verrouillés qui se trouvaient dans la voie.