2012-10-23 4 views
2

나는 Inno Setup 설치 프로그램에서 net use을 호출하여 공유 서버에 연결하려고합니다. 설치 관리자는 Windows XP에서 실행 중이지만 Windows 7에서는 실행되지 않는 서버에 연결할 수 있습니다. 동일한 명령을 입력하면 서버가 Windows 7에 연결되지만 설정은 admin 권한으로 실행됩니다. . 내가 Exec 또는 ShellExec 스크립트 기능을 통해 다음과 같은 net use 명령을 사용하고Windows 7에서 Inno 설치 프로그램의 "net use"명령을 실행하는 방법은 무엇입니까?

:

[Code] 
var 
    ErrorCode: Integer; 
    cmdString: String; 
    intvalue: Integer; 
    str: String; 

function InitializeSetup(): Boolean; 
begin 
    cmdString := '/c net use \\servername password /USER:username'; 
    ShellExec('', ExpandConstant('{cmd}'), cmdString , '', SW_SHOWNORMAL, 
    ewWaitUntilTerminated, ErrorCode) 
    if (ErrorCode = 0) then 
    begin 
    MsgBox(ExpandConstant('{cmd}'), mbInformation, MB_OK); 
    end; 
end; 

수있는 사람 : 사실

/c net use \\servername password /user:username 

, 여기에 net use 명령 호출을 보여주는 스크립트의 일부입니다 Windows 7에서 Inno Setup의 net use을 사용하는 방법을 제안 하시겠습니까? 우리는 단지 서버에 연결하여 사용자가 이름과 암호를 입력하게하려는 것입니다.

감사합니다.

+0

네트워크 공유 (패스워드없이)를 매핑하기 위해'net use '를 시도했지만 작동했습니다. 진실은 명령 행을 통해서가 아니라'Exec'를 사용하여 직접'net.exe '를 호출했다는 것입니다 (어쩌면 명령 행이 mazy 결과를 반환 할지도 모르겠지만 시도하겠습니다). 그동안 나는 당신에게 나의 테스트 코드를 게시 할 것이다. 다른 사람들을 위해, 내가이 질문에했던 업데이트는 상당히 오래되었던 논평 토론에서 나온 것이므로 OP에게 * workspace *를 정리하도록 요청했습니다. – TLama

+1

'net.exe'가 편리하지만, 항상 API를 직접 사용하는 편이 낫습니다 (이 경우에는 주어진 답안에서와 같이'WNetUseConnection'). 때로는 명령이 중지되고 예기치 않게 입력을 기다리는 경우가 있는데, 숨겨진 상태로 실행하려고하면 실제 문제가 발생할 수 있습니다. 숨겨진 상태로 실행하지 않으면 추한 콘솔 창이 나타납니다. 그것은 결국 소프트웨어가 아니라 콘솔에서 관리자가 사용하도록 설계되었습니다. 이것이 바로 API입니다. – Miral

+0

안녕하세요, Miral, net.exe로 Windows 7에서 문제가 발생했습니다. net 명령이 실제로 실행되지 않는 것 같습니다. 반환 값이 ok라는 것을 보여줍니다. 나는 이것이 inno 버그인지 궁금해. 아니면 뭔가를 놓쳤다. – xiaoheixiaojie

답변

5

자격 증명 대화 상자를 불러오는 원격 리소스에 연결하는 방법은 무엇입니까? 실제로이 답변의 제목이 말하는 것처럼, 당신이 CONNECT_INTERACTIVECONNECT_PROMPT 플래그와 함께 WNetUseConnection 함수 호출을 사용하는 것이 좋을 것 귀하의 질문에 다른보기를 사용

. 빈 사용자 ID 및 암호 매개 변수와 함께 사용하면 자격 증명 대화 상자가 호출됩니다. Inno Setup 스크립트에서 다음과 같이 보일 수 있습니다 :

[Setup] 
AppName=My Program 
AppVersion=1.5 
DefaultDirName={pf}\My Program 

[Code] 
#ifdef UNICODE 
    #define AW "W" 
#else 
    #define AW "A" 
#endif 
const 
    NO_ERROR = 0; 
    ERROR_ACCESS_DENIED = 5; 
    ERROR_BAD_NET_NAME = 67; 
    ERROR_ALREADY_ASSIGNED = 85; 
    ERROR_INVALID_PASSWORD = 86; 
    ERROR_INVALID_PARAMETER = 87; 
    ERROR_MORE_DATA = 234; 
    ERROR_NO_MORE_ITEMS = 259; 
    ERROR_INVALID_ADDRESS = 487; 
    ERROR_BAD_DEVICE = 1200; 
    ERROR_NO_NET_OR_BAD_PATH = 1203; 
    ERROR_BAD_PROVIDER = 1204; 
    ERROR_EXTENDED_ERROR = 1208; 
    ERROR_NO_NETWORK = 1222; 
    ERROR_CANCELLED = 1223; 
    RESOURCETYPE_ANY = $00000000; 
    RESOURCETYPE_DISK = $00000001; 
    RESOURCETYPE_PRINT = $00000002; 
    CONNECT_UPDATE_PROFILE = $00000001; 
    CONNECT_INTERACTIVE = $00000008; 
    CONNECT_PROMPT = $00000010; 
    CONNECT_REDIRECT = $00000080; 
    CONNECT_COMMANDLINE = $00000800; 
    CONNECT_CMD_SAVECRED = $00001000; 
type 
    TNetResource = record 
    dwScope: DWORD; 
    dwType: DWORD; 
    dwDisplayType: DWORD; 
    dwUsage: DWORD; 
    lpLocalName: string; 
    lpRemoteName: string; 
    lpComment: string; 
    lpProvider: string; 
    end; 
    TResourceType = (
    rtAny, 
    rtDisk, 
    rtPrinter 
); 

function WNetUseConnection(hwndOwner: HWND; const lpNetResource: TNetResource; 
    lpPassword, lpUserID: string; dwFlags: DWORD; lpAccessName: PAnsiChar; 
    var lpBufferSize, lpResult: DWORD): DWORD; 
    external 'WNetUseConnection{#AW}@mpr.dll stdcall'; 

function UseConnection(const ARemoteName: string; 
    AResourceType: TResourceType): DWORD; 
var 
    BufferSize: DWORD; 
    ResultFlag: DWORD; 
    NetResource: TNetResource; 
begin 
    case AResourceType of 
    rtAny: NetResource.dwType := RESOURCETYPE_ANY; 
    rtDisk: NetResource.dwType := RESOURCETYPE_DISK; 
    rtPrinter: NetResource.dwType := RESOURCETYPE_PRINT; 
    end; 
    NetResource.lpLocalName := ''; 
    NetResource.lpRemoteName := ARemoteName; 
    NetResource.lpProvider := ''; 
    BufferSize := 0; 
    Result := WNetUseConnection(WizardForm.Handle, NetResource, 
    '', '', CONNECT_INTERACTIVE or CONNECT_PROMPT, '', 
    BufferSize, ResultFlag); 
end; 

procedure UseConnectionButtonClick(Sender: TObject); 
var 
    S: string; 
    ResultCode: DWORD; 
begin 
    ResultCode := UseConnection('\\MySuperSecret\Place', rtDisk); 
    case ResultCode of 
    NO_ERROR: S := 'NO_ERROR'; 
    ERROR_ACCESS_DENIED: S := 'ERROR_ACCESS_DENIED'; 
    ERROR_ALREADY_ASSIGNED: S := 'ERROR_ALREADY_ASSIGNED'; 
    ERROR_BAD_DEVICE: S := 'ERROR_BAD_DEVICE'; 
    ERROR_BAD_NET_NAME: S := 'ERROR_BAD_NET_NAME'; 
    ERROR_BAD_PROVIDER: S := 'ERROR_BAD_PROVIDER'; 
    ERROR_CANCELLED: S := 'ERROR_CANCELLED'; 
    ERROR_EXTENDED_ERROR: S := 'ERROR_EXTENDED_ERROR'; 
    ERROR_INVALID_ADDRESS: S := 'ERROR_INVALID_ADDRESS'; 
    ERROR_INVALID_PARAMETER: S := 'ERROR_INVALID_PARAMETER'; 
    ERROR_MORE_DATA: S := 'ERROR_MORE_DATA'; 
    ERROR_INVALID_PASSWORD: S := 'ERROR_INVALID_PASSWORD'; 
    ERROR_NO_MORE_ITEMS: S := 'ERROR_NO_MORE_ITEMS'; 
    ERROR_NO_NET_OR_BAD_PATH: S := 'ERROR_NO_NET_OR_BAD_PATH'; 
    ERROR_NO_NETWORK: S := 'ERROR_NO_NETWORK'; 
    end; 
    MsgBox(S, mbInformation, MB_OK); 
end; 

procedure InitializeWizard; 
var 
    UseConnectionButton: TNewButton; 
begin 
    UseConnectionButton := TNewButton.Create(WizardForm); 
    UseConnectionButton.Parent := WizardForm; 
    UseConnectionButton.Left := 8; 
    UseConnectionButton.Top := WizardForm.ClientHeight - UseConnectionButton.Height - 8; 
    UseConnectionButton.Width := 155; 
    UseConnectionButton.Caption := 'Use connection...'; 
    UseConnectionButton.OnClick := @UseConnectionButtonClick; 
end; 
+0

안녕하세요 TLama, 코드를 제공해 주셔서 감사합니다. 나는 그것을 시도했지만 여기서는 효과가 없다. 내 넷 서버는 사용자 이름과 암호를 입력해야합니다. Windows 7에서는 설치 후 사용자가 서버에 연결하려고하면 창이 나타나서 사용자 이름과 암호를 입력하라는 메시지가 나타납니다. 또 다른 차이점은 드라이브를 매핑하는 것이 아니라 서버에 연결하는 것입니다. 드라이버를 매핑하려고했지만 작동하지 않았습니다. 이견있는 사람? – xiaoheixiaojie

+0

그게 내가 예상 한거야. 나는 그 방법을 발견했다고 생각한다. ['WNetUseConnection'] (http://msdn.microsoft.com/en-us/library/aa385482%28VS.85%29.aspx) 함수. 특정 상황에서 자격 증명 대화 상자를 호출합니다. 나는 당신에게 모범을 보일 것입니다.나는 다시 업데이트 될 것이다 ;-)하지만 질문에 대한 답이 더 많다. * 자격 증명 대화 상자를 표시하는 네트워크 리소스에 연결하는 방법은 무엇입니까? * – TLama

+0

테스트 한 약속 된 스크립트 코드를 게시했습니다. Windows 7 및 Windows XP 모드. – TLama