C# - NetUseAdd aus NetApi32.dll auf Windows Server 2008 und IIS7
Ich bin attemping zu verwenden NetUseAdd zum hinzufügen einer Aktie, die von einer Anwendung benötigt wird. Mein code sieht wie folgt aus.
[DllImport("NetApi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern uint NetUseAdd(
string UncServerName,
uint Level,
IntPtr Buf,
out uint ParmError);
...
USE_INFO_2 info = new USE_INFO_2();
info.ui2_local = null;
info.ui2_asg_type = 0xFFFFFFFF;
info.ui2_remote = remoteUNC;
info.ui2_username = username;
info.ui2_password = Marshal.StringToHGlobalAuto(password);
info.ui2_domainname = domainName;
IntPtr buf = Marshal.AllocHGlobal(Marshal.SizeOf(info));
try
{
Marshal.StructureToPtr(info, buf, true);
uint paramErrorIndex;
uint returnCode = NetUseAdd(null, 2, buf, out paramErrorIndex);
if (returnCode != 0)
{
throw new Win32Exception((int)returnCode);
}
}
finally
{
Marshal.FreeHGlobal(buf);
}
Dies funktioniert gut auf unsere server 2003-Boxen. Aber bei dem Versuch zu bewegen, um Server 2008 und IIS7 diese funktioniert nicht mehr. Durch liberale Protokollierung ich habe festgestellt, dass es hängt auf der Linie Marshal.StructureToPtr(info, buf, true);
Ich habe absolut keine Ahnung warum das so ist kann mir jemand alle vergossen Licht auf es für Sag mir, wo könnte ich weitere Informationen erhalten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund ist:
Du hast den p/invoke-Signatur ausschalten pinvoke.net und Sie hat es nicht überprüfen. Der Narr, der ursprünglich schrieb dieses p/invoke-Beispiel-code hatte keine Ahnung, was er Tat und schuf eine, "funktioniert" auf 32-bit-Systeme, aber funktioniert nicht auf 64-bit-Systeme. Er irgendwie sich eine sehr einfache p/invoke-Signaturen in einige unglaublich komplizierte Durcheinander, und es verbreitete sich wie ein Lauffeuer im Netz.
Die richtige Signatur ist:
Und Ihr code sollte lauten:
Ich hoffe, das war hilfreich. Ich habe gerade den halben Tag damit verbracht knee deep remote-debugging jemand elses trash code, um herauszufinden, was Los war und das war es.
\\server\share
, nichtserver\share
oder\\server
.\\server\c$
oder andere "Geheimnis" - Laufwerke sind auch eine option.ref USE_INFO_2 Buf,
Welche Art von layout Sie haben für Ihre struct? Ich glaube, die
USE_INFO_2
werden muss [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)].Außerdem haben Sie versucht, sich einfach nur die Struktur von ref eher als dass Marschall.StructureToPtr?
Gute Arbeit! Alles, was ich bekam nichts zu sehen in meinem windows-explorer. Ein paar Tage später, ShellNotification kam mir in den Sinn. Diese hatte ich zuvor verwendet für die Datei-Symbol Verband. Und als ich mich erinnerte, es war auch ein Auslöser für NetShare hinzufügen. Ja, richtig!
Nachdem ein NetShareAdd, die Sie zu erfüllen haben ein SHChangeNotify aus der shell32.dll.
- Und dies ist die Klasse, die ich dafür verwendet:
Ich hoffe, anderen reichte eine willkommene Ergänzung.