Сетевые диски не отображаются после успешного сопоставления в Windows10 - PullRequest
0 голосов
/ 31 декабря 2018

Я использую скрипт InnoSetup для сопоставления сетевого диска на ПК1 с общим каталогом на ПК2.Команда завершается успешно, но сетевой диск не отображается в окне обозревателя или в команде «net use» команды cmd.

ПК1 имеет Windows 10 pro.
ПК2 имеет Windows Server 2016 Standard.
Папка MySharedFolder является общей для всех пользователей с правами чтения и записи.
На обоих компьютерах отключен брандмауэр.
На ПК1 не работает UAC.
Для обеих машин установлены одинаковые имя пользователя и пароль ADMIN.

Я использую объект «WScript.Network» и метод «MapNetworkDrive» для сопоставления диска.См. Документ: https://docs.microsoft.com/en-us/previous-versions/8kst88h6%28v%3dvs.85%29 Я попытался запустить команду из inno setup с учетными данными и без них, и она не работает обоими способами.

Если я запускаю команду вручную из cmd: 'net useP: \ PC1 \ MySharedDir \ P / user: myUserName myPassword '(также без учетных данных) работает нормально, и я вижу подключенный диск в окне проводника.

Как мне подключить сетевой диск из inno setup, чтобы он работал и отображался в моем окне обозревателя?

Сценарий InnoSetup:

#define MyAppName "MyNetworkDriveMappingTest"
#define MyAppVersion "1.5"
#define NEW_LINE '#13#10'

[Setup]
AppId={{975540E2-1D87-43BF-BCBA-0519ED840364}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
CreateAppDir=no
OutputBaseFilename=setup1
Compression=lzma
SolidCompression=yes


[Code]
procedure mapNetworkDriveTest();
var
  WshNetWork : Variant;
  exitCode : Integer;
  driveLetter: String;
  pathToMap: String;
  userToUse: String;
  passwordToUse: String;
  cmdParams: String;

begin
  WshNetWork:=CreateOleObject('WScript.Network');

  driveLetter := 'P';
  pathToMap := '\\PC2\MySharedDir\P';
  userToUse := 'myUserName';
  passwordToUse := 'myPassword';

  if (DirExists(driveLetter+':\')) then
  begin
    WshNetwork.RemoveNetworkDrive(driveLetter+':' , true );
    Sleep(1000); // Sleep for 1 second to make sure the command finished properly
  end;


  //  Choose Mapping Drive Method:
  // two methods:
  // 1. cmd
  // 2. 'WScript.Network' object

    // Method 1 - CMD
    //cmdParams := 'net use '+driveLetter+': '+pathToMap+' /user:'+userToUse+' '+passwordToUse;
    //Exec('cmd.exe', '/c '+cmdParams+'', '', SW_SHOW, ewWaitUntilTerminated, exitCode);

    // Method 2 - 'WScript.Network' object
    exitCode := WshNetwork.MapNetworkDrive(driveLetter+':', pathToMap , false , userToUse , passwordToUse);


  if (exitCode <> 0) then
  begin
    MsgBox('Could not map network drive: '''+driveLetter + ''' to path '+pathToMap+{#NEW_LINE}+'CMD Error Code: '+IntToStr(exitCode)+{#NEW_LINE}+'Aborting mapping process of the drive ', mbError, MB_OK);
    Exit;
  end else
  begin
    MsgBox('Mapped network drive: '''+driveLetter + ''' to path '+pathToMap+' successfully', mbConfirmation, MB_OK);
  end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
var
  tempStr: String;
begin
  if (CurStep = ssPostInstall) then
  begin
    mapNetworkDriveTest();
  end;
end;
...